在matlab中使用递增计数器进行循环
我有一个15*15的二进制矩阵,我把每一行乘以它的转置,从外积中得到另一个矩阵,然后把这些矩阵加在一起,得到一个最终的矩阵。我正在尝试使用for循环来实现这一点,因为我有15行,并且我可能会将其增加到有大量行,因此,手动执行是没有意义的。对于转置乘法的行,我将遵循。然而,我想应用于整个矩阵。因此,我使用以下代码在matlab中使用递增计数器进行循环,matlab,matrix,Matlab,Matrix,我有一个15*15的二进制矩阵,我把每一行乘以它的转置,从外积中得到另一个矩阵,然后把这些矩阵加在一起,得到一个最终的矩阵。我正在尝试使用for循环来实现这一点,因为我有15行,并且我可能会将其增加到有大量行,因此,手动执行是没有意义的。对于转置乘法的行,我将遵循。然而,我想应用于整个矩阵。因此,我使用以下代码 VectMat=randi([0 1],15,15); resultt=zeros(15,15) for i= 1:15 row{i}=VecMat(1,:); resu
VectMat=randi([0 1],15,15);
resultt=zeros(15,15)
for i= 1:15
row{i}=VecMat(1,:);
result{i} = bsxfun(@times, row{i}.', row{i});
resultt=result|resultt
end
我得到了一个错误,我知道{ }的使用是不正确的,但是如果我尝试使用'[] ],Matlab会将“ReultTo”看作数组,并将继续以这种方式添加到它。我的伪代码是,在第一次迭代中,“i”将是一个,包含“{i}”的所有变量将是变量号1,然后在下一次迭代中,“i”将是2,依此类推。那么,我可以在matlab上做这个吗
您可以使用来创建所需的单例维度
,以让单例扩展
完成其工作,这将基本上取代您的循环。下面是实现-
any(bsxfun(@and,permute(VectMat,[3 2 1]),permute(VectMat,[2 3 1])),3)
请注意,可以使用bsxfun@times
代替了bsxfun(@和
),但根据我使用bsxfun
的经验,在这种情况下使用逻辑运算符(@和
)可以更高效。您可以使用创建所需的单例维度
,以让单例扩展
完成其工作,这将基本上取代您的循环。以下是实现-
any(bsxfun(@and,permute(VectMat,[3 2 1]),permute(VectMat,[2 3 1])),3)
请注意,可以使用bsxfun@times
代替了bsxfun(@和
),但根据我使用bsxfun
的经验,使用逻辑运算符(@和
)可能会更有效。使用any(bsxfun…)实现的答案要优雅得多(我从中学到了一些新的东西)。但是,关于您的实现,这是您将如何使其工作的。使用
for i = 1:15
row(i, :) = VecMat(i, :);
result = bsxfun(@times, row(i, :).', row(i, :));
resultt = result|resultt;
end
您还可以将行(i,:)
替换为简单的行
使用any(bsxfun…)实现的答案要优雅得多(我从中学到了一些新的东西)。但是,关于您的实现,这就是如何使其工作的。使用
for i = 1:15
row(i, :) = VecMat(i, :);
result = bsxfun(@times, row(i, :).', row(i, :));
resultt = result|resultt;
end
您还可以将
行(i,:)
替换为简单的行
让线性代数为您完成以下工作:
VectMat = double(VectMat);
out = (VectMat.'*VectMat)~=0
这将比使用循环或
bsxfun
更快。请注意,MATLAB中没有为逻辑定义矩阵乘法,因此您可能需要在之前转换为double
,具体取决于您创建“二进制”矩阵的方式。(在您提供的示例中,VectMat
已经是double。)让线性代数为您完成以下工作:
VectMat = double(VectMat);
out = (VectMat.'*VectMat)~=0
这将比使用循环或
bsxfun
更快。请注意,MATLAB中没有为逻辑定义矩阵乘法,因此您可能需要在之前转换为double
,具体取决于您创建“二进制”矩阵的方式。(在您提供的示例中,VectMat
已经是double。)这是一个你应该考虑阅读的帖子:这是Divakar在下面对你的回答中使用的基本方法。每一个外部产品都被放置在一个3D矩阵中,结果都被合并在一起,使用<代码>任何,它模拟一个逻辑的或所有的片段。这是一个你应该遵守的帖子。r reading:-这基本上与Divakar在下面的回答中使用的方法相同。每个外部产品都作为一个切片放置在3D矩阵中,结果都使用any
合并在一起,该方法模拟所有切片上的逻辑OR。这当然让我想起:)@rayryeng是的,事实上非常相似!是的。它还需要一个步骤…使用任何,但大部分都是那篇文章。@rayryeng和排列维度是不同的,因为OP here想要的是前一篇文章中的行而不是列。哇,我忘了向上投票了!只是这样做了。而且,我明白了。我意识到我想要它而不是列f行,因此排列肯定会有所不同。这肯定让我想起:)@rayryeng是的,事实上非常相似!是的。它还需要一个步骤…使用任何,但大部分都是那篇文章。@rayryeng和排列维度是不同的,因为OP here想要的是前一篇文章中的行而不是列。哇,我忘了向上投票了!只是这样做了。而且,我明白了。我意识到我想要它而不是列因为输入数组是二进制的,所以你需要转换成double()
。@Divakar:没错。OP的随机输入矩阵是双精度的,所以我没有想到!聪明的方法!因为输入数组是二进制的,你需要转换成double())
我想。@Divakar:没错。OP的随机输入矩阵是双精度的,所以我没有想到!如果你这样做,你就是在创建VectMat
的行的低效副本。行行(I,:)=…
是有问题的。对于for循环的每次迭代,必须分配一个更大的矩阵,并且必须重新排列行的值,因为MATLAB使用的存储原则是列主。更好的方法是替换行(i,:)的每次出现
在代码中使用行
,或者最好用VectMat(i,:)
替换行(i,:)
。如果这样做,您将创建VectMat
的行
的低效副本=…
是有问题的。对于for循环的每次迭代,必须分配一个更大的矩阵,并且必须重新排列行的值,因为MATLAB使用的存储原则是列主。更好的方法是替换行(i,:)
i的每次出现