【问题标题】:Vectorizing for loop on square matrix in matlab在matlab中对方阵上的循环进行向量化
【发布时间】:2018-01-12 12:03:00
【问题描述】:

我有一个包含大约 500000 个元素的大方阵 (refConnect)。 我需要执行这个操作:

tmp = find(referenceCluster == 67);
for j=1:length(tmp)
    refConnect(tmp(j),tmp)=1;
end

我想知道是否有一种简单的方法可以将其矢量化,这样我就可以避免永远占用的 for 循环。 谢谢你的帮助。 干杯

【问题讨论】:

  • referenceCluster 的大小是多少?是长度为size(refConnect,1)的向量吗?
  • 我认为循环可以只替换为refConnect(tmp,tmp)=1;你也可以删除find如下:tmp = referenceCluster==67; refConnect = bsxfun(@times, tmp, tmp.')
  • @LuisMendo 我认为您在bsxfun 示例中遗漏了一步,因为您的输出将是逻辑矩阵(尽管由于@times 而不是@and 而加倍)矩阵,而不是原始矩阵将一些值替换为 1 的矩阵。也适用于其他读者:自 R2016b 以来,这两个语句是等效的:bsxfun(@times, tmp, tmp')tmp .* tmp'
  • 是的,路易斯,你说得对。谢谢
  • @Wolfie 你是对的。我假设refConnect 最初是未定义的,如示例中所示

标签: matlab matrix vectorization


【解决方案1】:

似乎您无法显着减少执行时间。 尝试使用此测试函数评估执行时间。

function test_spped(N, M)
if nargin < 1
    N = 707;
end
if nargin < 2
    M = 2;
end

refConnectIn = rand(N, N);
referenceCluster = randi(M, N, 1);

refConnectA = refConnectIn;
tic
tmpA = find(referenceCluster == 1);
for j=1:length(tmpA)
    refConnectA(tmpA(j),tmpA) = 1;
end
toc

refConnectB = refConnectIn;
tic
tmpB = referenceCluster == 1;
refConnectB(tmpB, tmpB) = 1;
toc

if isequal(refConnectA, refConnectB)
    disp('Result are equals');
else
    disp('Result are UNEQUALS!');
end

使用默认参数可以得到:

>> test_speed
Elapsed time is 0.002865 seconds.
Elapsed time is 0.001575 seconds.
Result are equals

注意,向量化代码的执行时间(B 情况)对于大 M 可能会更糟:

>> test_speed(707,1000)
Elapsed time is 0.001623 seconds.
Elapsed time is 0.002219 seconds.
Result are equals

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    相关资源
    最近更新 更多