我有N * M矩阵和两个1 * M行向量我想对它们进行矢量化数学运算

时间:2016-02-09 18:45:50

标签: matlab vectorization

我有N个M矩阵A,1个M矩阵或行向量B. 另外1乘M行向量C.我可以将以下代码向量化吗?

for i = 1:N
     A(i,:) = (A(i,:)-B)./C;
end;

那么我们有K个M矩阵(K可以被N整除)而不是矢量的更一般情况呢?

2 个答案:

答案 0 :(得分:5)

这是bsxfun的目的:

A = bsxfun(@rdivide,bsxfun(@minus,A,B),C);

它会自动扩展大小为[1 M]的数组,使其与大小为[N M]的数组兼容,然后对它们执行必要的数组操作,返回大小为[N M]的数组。

如果您的BC数组的大小为[K M],那么它会更难一些。您没有指定输出的形状,但在最常见的情况下,您可以为BC的每一行计算“(AB)/ C”并在数组中收集这些矩阵大小[K N M]

A = bsxfun(@rdivide,bsxfun(@minus,permute(A,[3 1 2]),permute(B,[1 3 2])),permute(C,[1 3 2]));

其中A转换为大小为[1 N M]的数组,BC都转换为大小[K 1 M]。根据不同维度的数组大小,您可能会将M置于前面(因为这是您减去的维度,但我不确定。

答案 1 :(得分:0)

除非你需要原始速度,否则我更倾向于采用更明确的方法:

N = size(A, 1);
easy = (A-repmat(B, N, 1)) ./ repmat(C, N, 1);

repmat复制第一个参数,第二个参数的数量垂直(按行),以及它们在列中的第三个参数次数。因此,在这种情况下,通过仅垂直复制矢量N次,B变为N×M。

对于更一般的情况,B& C是K×M,N / K是整数:

rowReps = size(A, 1)/size(B, 1);
notMuchHarder= (A - repmat(B, rowReps , 1) ./ repmat(C, rowReps, 1);
相关问题