matlab 如何将矩阵中不重复的元素组成行向量?

nwnhqdif  于 2023-03-03  发布在  Matlab
关注(0)|答案(1)|浏览(182)

我有571个矩阵(625 x625),所有的矩阵都是对称的,名字分别是z1,z2,...z571;我需要把每个矩阵的非重复元素放在一个行向量中。例如,通过把z1的非重复元素放在一个行向量中,我得到行向量c1。从z2得到c2,...这是我从z1得到c1的代码:

c1=zeros(1,195625);
z1=zeros(625);
for i=1:625
    for j=1:625
        if (i<=j)
            z1(i,j)=c1(1,n);
            n=n+1;
        end
    end
end

第一个问题是跑的时间太长了。有没有办法提高速度?第二个问题:如果我想从z1得到c1,从z2得到c2,...从z571得到c571,然后用c1,c2,...,c571的行构成一个矩阵X,我该怎么做?谢谢你的帮助

yfjy0ee7

yfjy0ee71#

通过预先计算需要哪些元素,然后使用逻辑索引一次获取所有元素,可以使代码运行得更快:

% Make symmetric matrix
matrixsize = 625;
z = rand(matrixsize);
z = z + z';

% Compute unique elements
uniqueelements = tril(true(size(z,1)));

% Pull unique elements from matrix
c = z(uniqueelements);
% Transpose to turn c from a column into a row.
c = c';

然后将每一个放入您的行中:

numMatrices = 571;
X = zeros(numMatrices,numel(c1));
for n = 1:numMatrices
    X(n,:) = % However you're dynamically referencing your c variables
end

如果按照Luis的评论将矩阵存储在一个三维数组中,仍然可以一次性执行所有操作,并且可以免费获得X数组:

matrixsize = 625;
numMatrices = 571;

zs = rand(matrixsize,matrixsize,numMatrices);
zs = zs + pagetranspose(zs);

uniqueelements = tril(true(size(zs,1)));
numElementsPerMatrix = sum(uniqueelements,"all");
uniqueelements = repmat(uniqueelements,1,1,size(zs,3));

cs = reshape(zs(uniqueelements),numElementsPerMatrix,size(zs,3));
cs = cs';

注意:使用tril而不是triu是因为MATLAB以列为主的顺序从逻辑索引返回元素,而原始循环以行为主的顺序遍历矩阵。

相关问题