我对MATLAB很新,并且有一段代码可以创建一个距离矩阵。 更确切地说,它在位于无向图上的点之间创建距离矩阵D,使得Dij是该图上的点之间的最短路径。 这个矩阵显然是对称的(因为图是无向的),以下是我用来创建它的代码片段:

D = zeros(size(data,1));
for i = 1:size(data, 1)
    for j = 1:size(data, 1)
        [D(i, j), ~, ~] = graphshortestpath(G, i, j, 'Directed', false);
    end
end

这显然非常浪费,因为我没有利用矩阵的对称性。 有什么方法我只能计算矩阵的上三角形部分然后以某种方式将下三角形部分“追加”到它,这样我就可以将计算从n ^ 2减少到n ^ 2/2?

任何帮助,赞赏,

贾森

===============>>#1 票数:2 已采纳

当然。 只需考虑迭代的顺序,找出首先达到的三角形。

D = zeros(size(data,1));
for i = 1:size(data, 1)
    for j = 1:size(data, 1)
        if j > i
            [D(i, j), ~, ~] = graphshortestpath(G, i, j, 'Directed', false);
        else
            D(i, j) = D(j, i);
        end
    end
end

如果对角线元素不是相同的零,则可以使用if j >= i

===============>>#2 票数:1

对于无向和未加权的图形,计算距离矩阵的另一种方法

如果您试图减少运行时间,可能会有所帮助。 在Matlab的情况下,大多数时候,我发现按入口扫描输入速度较慢。 我只是猜测你问这个问题的目的,对不起,如果我不在话题。

给定邻接Matix(G),我会按以下方式计算距离矩阵,

假设:1。G是无向和未加权的(矩阵填充'0'和'1')2。N是图的顺序,G的大小为N x N

function [D,connect]=genDistance(G,N)

D = G;
B = G;
connect = 0;
i=1;
while((~connect)&&(i<N-1))    % the maximum distance from one vert to another
    i = i + 1;                % is N-1
    B = B * G;                % G to the power of i
    D = D + i * (D==0&B>0);   % D==0 & B>0 the entries to be updated 
    connect = ( min(min(D)) )>0;  %check if D has zero entry
end
D ( eye(N) ) = 0 ; %clear diagonal entries
  • (i,j)“G power k”中的条目将给出从G到Vi的长度k的步数k
  • 最后,connect将告诉您图表是否已连接

===============>>#3 票数:0

您可以为矩阵G的下半部分生成索引

N = length(G);
[irow, icol] = find(tril(ones(N),-1));

然后你可以遍历这些索引:

D = zeros(size(G));
for i = 1:numel(irow)
   [D(irow(i), icol(i)] = graphshortestpath(G, irow(i), icol(i), 'Directed', false);
end
D = D + D';

另一个选择是使用带有索引的ARRAYFUN和SQUAREFORM将结果向量转换为方形矩阵:

D = arrayfun(@(x,y) graphshortestpath(G,x,y, 'Directed', false), irow, icol);
D = squareform(D);

  ask by Jason translate from so

未解决问题?本站智能推荐:

1回复

从MATLAB中的向量创建对称矩阵

如何在MATLAB中将向量A转换为对称矩阵M 这样,M是对称矩阵(即A21 = A12)并且所有对角线项都相等(即A11 = A22 = A33 = A44)。
2回复

Matlab矩阵的高效复制

我有(1:10),<10 x 1>两倍的矩阵(a)。 我想复制值并将它们按列重新排列到另一个矩阵var中。 (b)。 请参见下面的示例。 另外,在此任务上哪种方法最有效? 更新:再次您好Amro。 如果要定义要复制的值该怎么办。 请参见以下示例:
2回复

MATLAB:快速创建具有固定度数(行总和)的随机对称矩阵

我正在寻找一种快速创建具有以下特性的随机矩阵A方法: A = transpose(A) 所有i的A(i,i) = 0 对于所有i,j的A(i,j) >= 0 sum(A) =~ degree ; 行总数由我要指定的分布随机分布(此处=~表示近似相等)。
1回复

Matlab协方差矩阵的对称正半定性

大家好,我有这个问题: 我有n个向量的数据集,每个向量都有D维。 我还有一个大小为D * D的协方差矩阵,设为C。 我执行以下操作: 我从数据集中选择了K个向量,还随机选择了E个维度。 令M为选定维度上选定数据的样本协方差,因此M为E * E矩阵。
2回复

如何创建对称的零和一矩阵

我需要创建一个100 * 100对称矩阵,该矩阵具有零和一的随机分布,但是对角线应该全为零,我该怎么做?
1回复

MATLAB中对称矩阵的复特征向量

我有以下代码片段,试图计算真实对称矩阵的本征分解 不幸的是,这似乎在MATLAB R2013a上产生了真正复杂的特征向量。 我曾经认为eig对于真正的对称矩阵应该使一切保持真实。 有人知道为什么会这样吗? PS。 例如,更改为n = 6,将输出实数。
1回复

MATLAB:对角化复杂的反对称矩阵

我正在使用以下功能来阻止对角化反对称矩阵。 该代码对于实际的反对称矩阵非常适用,但是对于复杂的反对称矩阵却无法实现,如下所示: 如何修正我的代码以使其也适用于复杂矩阵? 我想要一个块对角矩阵(以下形式)作为实矩阵和复矩阵的输出。
2回复

矩阵创建MATLAB

我正在使用以下代码在Matlab中构建nxn矩阵: 我正在用a = 1 b = 10和n = 10进行测试。 我得到的期望结果高达i = 8 我= A = 第1至7栏 第8至10栏 但是从i = 9开始变为: 我= A = 1.0
2回复

matlab中高效密集对角矩阵的生成[重复]

这个问题在这里已有答案: 在matlab 3答案中 使用元素加法向矩阵的对角线添加值 matlab:对角填充矩阵[复制] 2个答案 给定一个复杂的数组data ,我需要构造一个带状对角矩阵 使用matlab或python,其中*表示复共轭。 现在
3回复

MATLAB - 使用子矩阵创建矩阵

假设我有三个不同的2x2子矩阵,我想在Matlab中创建一个大的6x6矩阵,其中三个子矩阵出现在对角线上,而所有其他值都是0.如何明确地输入所有零值? 我刚开始学习MatLab,我真的很新手。 如果有人可以帮助我,我将非常感激! 后来我必须用更多的矩阵来做这件事,并且输入所有的零正在变得痛