Matlab 矩阵运算困难
我无法将向量推回矩阵。考虑到,N×N矩阵称为Matlab 矩阵运算困难,matlab,vector,matrix,matrix-multiplication,Matlab,Vector,Matrix,Matrix Multiplication,我无法将向量推回矩阵。考虑到,N×N矩阵称为MyMatrix,其中N=10,由零和非零元素组成,对角线元素均为零。共有2个向量:维度为15的正向量,由从MyMatrix提取的10个非零元素组成,以及ConceptsVector分别由N元素组成。假设向量由以下元素组成 Positive_Vector=[MyMatrix(1,2)、MyMatrix(1,6)、MyMatrix(2,5)、MyMatrix(2,6)、MyMatrix(2,10)、MyMatrix(3,1)、MyMatrix(4,10)
MyMatrix
,其中N=10
,由零和非零元素组成,对角线元素均为零。共有2个向量:维度为15的正向量
,由从MyMatrix
提取的10个非零元素组成,以及ConceptsVector
分别由N
元素组成。假设向量由以下元素组成
Positive_Vector=[MyMatrix(1,2)、MyMatrix(1,6)、MyMatrix(2,5)、MyMatrix(2,6)、MyMatrix(2,10)、MyMatrix(3,1)、MyMatrix(4,10)、MyMatrix(5,3)、MyMatrix(5,9)、MyMatrix(6,1)、MyMatrix(6,7)、MyMatrix(7,3)、MyMatrix(7,4)、MyMatrix(8,1)、MyMatrix(8,3)]代码>
我的问题是如何使用一个新的向量更新MyMatrix
,该向量由相同维度但不同的元素值组成,如下操作
C1 = Concepts*NewMyMatrix
可以表演吗
这就是我如何提取正向量的方法。有人能演示一下如何做相反的操作吗?即将new\u Positive\u Vector
的新元素推回到NewMyMatrix
中的相应位置
for ii = 1:10
for jj = 1:10
if (MyMatrix(ii,jj)~=0)
Positive_Vector = MyMatrix(ii,jj);
end
end
end
你的解释很模糊,但我假设你想从矩阵中提取非零(或正)元素,对这些元素进行一些运算,然后将它们推回原始矩阵。那么我建议,
MyMatrix = (rand(5)>0.5).*rand(5);
[n,m,Positive_vector] = find(MyMatrix);
k = sub2ind(size(MyMatrix),n,m);
MyMatrix(k) = Positive_vector*2;
第一行用于生成带有一些零的随机矩阵。第二行是找到矩阵的非零元素。如果只需要正元素,则可以将其修改为find(MyMatrix>0)
。在这里,n和m是非零元素的行数和列数的集合,但我在第三行将其转化为1D索引。第四行是对提取的向量应用一些运算(本例为乘以2),并将其推回原始矩阵中的原始位置
我假设你做的运算比非零元素乘以2更复杂。否则你可以这样做
MyMatrix = MyMatrix - (MyMatrix>0).*MyMatrix + (MyMatrix>0).*(MyMatrix)*2
如果我理解正确,您应该执行以下操作:
首先,使用您为生成PositiveVector
提供的代码,您将得到一个元素,而不是一个向量。我假设您希望按如下方式生成它:
[nonZeroRows,nonZeroCols]=find(MyMatrix~=0);
Positive_Vector=MyMatrix(sub2ind(size(MyMatrix),nonZeroRows,nonCols));
NewMyMatrix=zeros(size(MyMatrix));
NewMyMatrix(sub2ind(size(NewMyMatrix),nonZeroRows,nonZeroCols))=`New_Positive_Vector`;
假设现在有一个New_Positive_Vector
,您想将其插入NewMyMatrix
,您可以按如下方式操作:
[nonZeroRows,nonZeroCols]=find(MyMatrix~=0);
Positive_Vector=MyMatrix(sub2ind(size(MyMatrix),nonZeroRows,nonCols));
NewMyMatrix=zeros(size(MyMatrix));
NewMyMatrix(sub2ind(size(NewMyMatrix),nonZeroRows,nonZeroCols))=`New_Positive_Vector`;
这里是一个稍微简单一点的方法来做ysakamoto做的事情:
%// some test matrix
MyMatrix = (rand(5)>0.5).*rand(5);
%// Logical indices to the non-zero entries
inds = MyMatrix ~= 0;
%// Do operations on the non-zeros, and assign results back
MyMatrix(inds) = 2*MyMatrix(inds);
当我找到(MyMatrix~=0)时,正向量中的值都是逻辑1。删除~=0后,代码工作正常。因此,我接受了先前的答案。无论如何,感谢您的帮助,代码片段的其余部分在其他方面都是ok.ok。学习使用sub2ind
和ind2sub
。这些都是强大的命令。谢谢你的解释。