我正在生成一个随机二进制矩阵,每行有一个特定数量的1。现在,我想取矩阵中的每一行并乘以它的转置(即row1'*row1
)。
所以,我使用row1=rnd_mat(1,:)
获取第一行。但是,在乘法步骤中我得到此错误
“两个逻辑输入必须是标量。要计算元素TIMES,请改用TIMES(。*)。”
知道我不想按元素计算,我想使用外部产品生成矩阵。我尝试使用row1
手动编写[0 0 1 ...]
,并尝试查找外部产品。我设法得到了我想要的矩阵。
那么,有没有人对如何做到这一点有一些想法?
答案 0 :(得分:2)
MATLAB不支持logical
矩阵或向量的矩阵乘法。这就是你得到这个错误的原因。在尝试执行该操作之前,您需要将矩阵转换为double
或其他有效的数字输入。因此,做这样的事情:
rnd_mat = double(rnd_mat); %// Cast to double
row1 = rnd_mat(1,:);
result = row1.'*row1;
你基本上计算的是两个向量的外积。如果您想避免转换为double
,请考虑使用bsxfun
为您完成工作:
result = bsxfun(@times, row1.', row1);
这样,您不需要在执行外部产品之前投射矩阵。请记住,两个向量的外积只是两个矩阵的逐元素乘法,其中一个矩阵由行向量组成,其中每行是行向量的副本,而另一个矩阵是列向量,其中每列是列向量的副本。
bsxfun
自动广播每个行向量和列向量,以便我们生成两个兼容维度的矩阵,并按元素乘法执行元素,从而生成外部乘积。