在matlab中检查没有for循环的数组成员
Checking membership in an array without for loop in matlab
我想简化此代码,使其在没有 for 循环的情况下工作。
for i=1:N
for j=1:N
if ismember(j,A)
PID(i,i)=TFP(i,j)+ PID(i,i);
end
end
end
其中A
是一个包含一些标签的矩阵。我之前以N*N稀疏double的形式存储了TFP
。所以,我想出了以下解决方案,但我找不到一种方法来实现成员资格条件(由?指定)。
PID = sum(TFP).*(?);
可以不用循环实现吗?
你的ismember(j,A)
相当于只用A
的值来索引。所以你可以使用它并完全避免 ismember
函数(这是迄今为止代码中最慢的部分)。
所以优化的第一步是
A2=unique(A); % just in case you do not do this already
for i=1:N
for j=A2
PID(i,i)=TFP(i,j)+ PID(i,i);
end
end
这应该已经很快了。循环在 MATLAB 中还不错,并且得到了 JIT 编译器的大量优化。
优化的下一步是将所有索引放在一起并删除二次循环。你可以用线性索引来做到这一点,所以
A2=unique(A); % just in case you do not do this already
for i=1:N
PID(i,i)=sum(TFP(i,A2));
end
最后,您可以通过对角化所需列的总和来消除此问题:
A2=unique(A); % just in case you do not do this already
PID=diag(sum(TFP(:,A2),2));
我不确定我是否完全理解你的问题
你试过这个吗?
j=1:N;
PID = sum(TFP).*ismember(j,A);
ismember 可以用作矩阵,当 true 等于“1”时,它允许相乘。
您可以使用矩阵乘法,而不是对逐元素乘法的结果求和。它计算产品的总和而不创建临时数组:
J = ismember(1:N, A).';
PID = diag(TFP * J);
我想简化此代码,使其在没有 for 循环的情况下工作。
for i=1:N
for j=1:N
if ismember(j,A)
PID(i,i)=TFP(i,j)+ PID(i,i);
end
end
end
其中A
是一个包含一些标签的矩阵。我之前以N*N稀疏double的形式存储了TFP
。所以,我想出了以下解决方案,但我找不到一种方法来实现成员资格条件(由?指定)。
PID = sum(TFP).*(?);
可以不用循环实现吗?
你的ismember(j,A)
相当于只用A
的值来索引。所以你可以使用它并完全避免 ismember
函数(这是迄今为止代码中最慢的部分)。
所以优化的第一步是
A2=unique(A); % just in case you do not do this already
for i=1:N
for j=A2
PID(i,i)=TFP(i,j)+ PID(i,i);
end
end
这应该已经很快了。循环在 MATLAB 中还不错,并且得到了 JIT 编译器的大量优化。
优化的下一步是将所有索引放在一起并删除二次循环。你可以用线性索引来做到这一点,所以
A2=unique(A); % just in case you do not do this already
for i=1:N
PID(i,i)=sum(TFP(i,A2));
end
最后,您可以通过对角化所需列的总和来消除此问题:
A2=unique(A); % just in case you do not do this already
PID=diag(sum(TFP(:,A2),2));
我不确定我是否完全理解你的问题 你试过这个吗?
j=1:N;
PID = sum(TFP).*ismember(j,A);
ismember 可以用作矩阵,当 true 等于“1”时,它允许相乘。
您可以使用矩阵乘法,而不是对逐元素乘法的结果求和。它计算产品的总和而不创建临时数组:
J = ismember(1:N, A).';
PID = diag(TFP * J);