如何从列中创建对称矩阵?

时间:2017-11-03 19:41:32

标签: algorithm matlab matrix

例如,我想转到以下列:

[90; 175; 600; 650; 655; 660] 

进入矩阵:

[ 90, 175, 600, 650, 655, 660; 
 175, 600, 650, 655, 660, 655; 
 600, 650, 655, 660, 655, 650; 
 650, 655, 660, 655, 650, 600; 
 655, 660, 655, 650, 600, 175; 
 660, 655, 650, 600, 175,  90] 

我会使用什么算法?

到目前为止,我有:

col = [90; 175; 600; 650; 655; 660];
[numrows, temp] = size(col);
Z = zeros(numrows, numrows);
for i = 1:1:numrows
    for j = 1:1:numrows
        Z(i,j) = col(i);
        Z(j,i) = col(i);
    end
end

3 个答案:

答案 0 :(得分:3)

内置函数toeplitz在几次翻转后提供您想要的内容:

>> col = [90; 175; 600; 650; 655; 660];
>> result = flipud(toeplitz(flip(col)))
result =
    90   175   600   650   655   660
   175   600   650   655   660   655
   600   650   655   660   655   650
   650   655   660   655   650   600
   655   660   655   650   600   175
   660   655   650   600   175    90

答案 1 :(得分:3)

hankel函数可用于生成矩阵:

col = [90; 175; 600; 650; 655; 660] 
result = hankel(col, flip(col));

答案 2 :(得分:2)

以下代码将执行您想要的操作:

col = [90; 175; 600; 650; 655; 660];
numrows = size(col, 1);
Z = zeros(numrows, numrows);
for i = 1:numrows
    for j = 1:numrows
        Z(i,j) = col(numrows - abs(numrows - (i+j-1)) );
    end
end

Z(j,i) = col(i)之后的行Z(i,j) = col(i)显示了您对代码理解的一个严重缺陷。鉴于您循环遍历矩阵的每个索引,这将导致许多索引被写入多次,每次都有不同的结果。它确实给你一个对称的模式,但不是你想要的。不应使用Z(i,j) Z(j,i),您应该(如上所述)仅分配给Z(i,j)一次,而是计算{{1}的索引从coli使用。