matlab - 如何向量化二维矩阵每一行的外积矩阵的评估?
问题描述
我正在尝试加快评估外部产品矩阵的过程。我有一个名为 4*n 的矩阵a
。我想a
通过以下公式评估 的每一行的外积矩阵:
K = a*a';
如果我使用for
循环对该过程进行编码,则如下所示:
K=zeros(4,4,size(a,2));
for i=1:size(a,2)
K(:,:,i) = a(:,i)*a(:,i)';
end
我找到了另一种方法 using cellfun
,它比以前更慢。
acell = num2cell(a, 1);
b = cellfun(@(x)(x*x'),acell,'UniformOutput',false);
K = reshape(cell2mat(b),4,4,[]);
有没有什么好的方法来实现这些过程,比如矢量化?
解决方案
您可以使用kron
重复矩阵 n 次,因此无需预先分配,然后与 执行逐元素乘法a(:).'
,最后重塑以添加第三维。
%Dummy 2D matrix 4x3
a = [1 4 7
2 5 8
3 6 9
4 7 10]
%Size of the first dimension
n = size(a,1);
%Repeat the matrix n time
p = kron(a,ones(1,n)).*a(:).'
%Reshape to A = 4x4x3
A = reshape(p,n,n,[])
您失去了 for 循环方法的可读性,但您应该提高性能。
推荐阅读
- scala - 不适合内存的文件的不可变数据结构
- ios - 使用 AVAudioEngine 循环音频
- django - 如何在 heroku 上使用 gunicorn 和 daphna 运行我的 Django 应用程序?
- r - 如何在不使用 confint 的情况下计算 R 中平均值的置信区间
- regex - 在 Google Data Studio 中创建新指标以仅计算品牌 KW 展示次数
- int - 错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数
- sql - 从付款表 postgresql 中检索最后日期
- c - 孙子进程在 C 中具有 PID 1
- java - 如何仅使用堆栈实现递归函数?
- angular - 运行 ng new myapp 后将路由选项 No 更改为 Yes 的正确方法