我需要評估下面的表達式(僞算術符號):如何向量化正常和點的陣列之間的點積之和
∑ipi⋅n
其中p
是一個矩陣的三元向量和n
是三元向量。我可以用for循環做如下,但我無法弄清楚如何 矢量化這樣的:
p = [1 1 1; 2 2 2];
n = [3 3 3];
s = 0;
for i = 1:size(p, 1)
s = s + dot(p(i, :), n)
end
我需要評估下面的表達式(僞算術符號):如何向量化正常和點的陣列之間的點積之和
∑ipi⋅n
其中p
是一個矩陣的三元向量和n
是三元向量。我可以用for循環做如下,但我無法弄清楚如何 矢量化這樣的:
p = [1 1 1; 2 2 2];
n = [3 3 3];
s = 0;
for i = 1:size(p, 1)
s = s + dot(p(i, :), n)
end
我認爲你可以bsxfun
做到這一點:
sum(sum(bsxfun(@times,p,n)))
'bsxfun'很有趣,但是在這個特定的解決方案中,它沒有到位:(...這個'bsxfun'沒有+1。 – Shai
@Shai你已經提到'bsxfun'這麼多次,只要你現在提到它,你就用押韻說話;) –
----------
% Is it the same for this case?
----------
n = 200; % depending on the computer it might be
m = 1000*n; % that n needs to be chosen differently
A = randn(n,m);
x = randn(n,1);
p = zeros(m,1);
q = zeros(1,m);
tic;
for i = 1:m
p(i) = sum(x.*A(:,i));
q(i) = sum(x.*A(:,i));
end
time = toc; disp(['time = ',num2str(time)]);
找到(以及)不需要的解決方案以轉置A.當然,請提供您用於矢量化的命令。 – pietervs
matlab有'+ ='運算符嗎?你使用什麼版本? – Shai
@Shai顯然這個示例代碼還沒有經過測試。 for循環也被不小心編寫了。我已經解決了他們兩個。 –
@EitanT我正在研究一箇舊的matlab版本,我有點希望他們實現'+ ='...太糟糕了。 – Shai