我有一个15 * 15的二进制矩阵我将每一行乘以它的转置以从外部产品中获得另一个矩阵,然后将这些矩阵与OR一起得到最终矩阵。我试图使用for循环执行此操作,因为我有15行,我可能会增加它以拥有大量行,因此,手动执行它是没有意义的。对于通过转置乘法的行,我遵循rayryeng answer。然而,我想申请整个矩阵。所以,我使用以下代码。
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将考虑'结果'作为一个数组,并将继续以这种方式添加它。我的伪代码是,在第一次迭代中,' i'将是包含' {i}'的所有变量之一。将是变量编号1,然后在下一次迭代中使用' i'将是2,依此类推。那么,我可以在matlab上做到这一点吗?
答案 0 :(得分:4)
您可以使用permute
创建bsxfun
所需的singleton dimensions
,让singleton-expansion
完成其工作,哪些基本上会取代您的循环。这是实施 -
any(bsxfun(@and,permute(VectMat,[3 2 1]),permute(VectMat,[2 3 1])),3)
请注意,可以使用bsxfun@times
代替bsxfun(@and
,但根据我使用bsxfun
的经验,使用逻辑运算符(在这种情况下为@and
)可以更有效率。
答案 1 :(得分:2)
让线性代数为你工作:
VectMat = double(VectMat);
out = (VectMat.'*VectMat)~=0
这比使用循环或bsxfun
更快。请注意,矩阵乘法没有为MATLAB中的逻辑定义,因此您可能需要先转换为double
,具体取决于您创建“二进制”的方式。矩阵。 (在您提供的示例中,VectMat
已经是双倍。)
答案 2 :(得分:0)
使用any(bsxfun ...)实现的答案更加优雅(我从中学到了新的东西)。但是,关于您的实现,这就是您如何使其工作。使用
for i = 1:15
row(i, :) = VecMat(i, :);
result = bsxfun(@times, row(i, :).', row(i, :));
resultt = result|resultt;
end
您也可以使用row(i, :)
替换row
。