我有N个M矩阵A,1个M矩阵或行向量B. 另外1乘M行向量C.我可以将以下代码向量化吗?
for i = 1:N
A(i,:) = (A(i,:)-B)./C;
end;
那么我们有K个M矩阵(K可以被N整除)而不是矢量的更一般情况呢?
答案 0 :(得分:5)
这是bsxfun
的目的:
A = bsxfun(@rdivide,bsxfun(@minus,A,B),C);
它会自动扩展大小为[1 M]
的数组,使其与大小为[N M]
的数组兼容,然后对它们执行必要的数组操作,返回大小为[N M]
的数组。
如果您的B
和C
数组的大小为[K M]
,那么它会更难一些。您没有指定输出的形状,但在最常见的情况下,您可以为B
和C
的每一行计算“(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]
的数组,B
和C
都转换为大小[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);