在matlab中使用递增计数器进行循环

在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

我有一个15*15的二进制矩阵,我把每一行乘以它的转置,从外积中得到另一个矩阵,然后把这些矩阵加在一起,得到一个最终的矩阵。我正在尝试使用for循环来实现这一点,因为我有15行,并且我可能会将其增加到有大量行,因此,手动执行是没有意义的。对于转置乘法的行,我将遵循。然而,我想应用于整个矩阵。因此,我使用以下代码

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的每次出现