如何创建随行索引和数据变化的三角矩阵?

时间:2016-01-19 13:22:58

标签: matlab for-loop while-loop sqrt

我需要计算一些积分。首先,我要解释这个问题。 我有一个名为X的数据向量。

X=[20 50 100 150 200 300]

我需要生成一些数据,我正在使用这种方法:

a11=sqrt(1-0/20)-sqrt(1-20/20);

这是20或X(1)的结果。 然后我需要计算一下:

a21=sqrt(1-0/50)-sqrt(1-20/50);
a22=sqrt(1-20/50)-sqrt(1-50/50);

这是50或X(2)的结果。

对于X(3)我需要a31,a32,a33,对于X(4)我需要a41,a42,a43,a44 ...... 然后我需要将这些值放在X中的矩阵中。

矩阵应如下所示:

20 a11
50 a21 a22
100 a31 a32 a33
150 a41 a42 a43 a44
.
.
.

谢谢。

5 个答案:

答案 0 :(得分:7)

只需添加无循环解决方案:

X = [20 50 100 150 200 300];
X2 = [0 X];
outmat = [X.', tril(-diff(sqrt(1-(1./X).'*X2),1,2))];

输出矩阵的非平凡部分的工作原理如下:它首先计算矩阵中的sqrt(1-X(k)/X(l))种值,基本上将矩阵创建为X和{{1的二元乘积(后者是使用前导X2元素扩展的X)。然后,我们沿着它的第二维度计算该矩阵的0:注意diff的第二个输入参数给出数值导数的 order 。然后我们用diff剪切下三角形部分。

答案 1 :(得分:4)

X = [20 50 100 150 200 300];
N = length(X);
result = zeros(N, N);

for row = 1:N
    % Calculate current line
    result(row, 1) = sqrt( 1 - 0/X(row) ) - sqrt( 1 - X(1)/X(row) );
    for col = 2:row
        result(row, col) = sqrt( 1 - X(col-1)/X(row) ) - sqrt( 1 - X(col)/X(row) );
    end
end

% Prepend with X as a row vector
result = [ X.', result ];

答案 2 :(得分:3)

您的计算可以在没有循环的情况下完成。因为没有递归计算。以下将做到这一点。

B = sqrt(tril(1-bsxfun(@rdivide,[0 X],X'),1));
A = [X' -diff(B,1,2)];

bsxfun将创建您根内的所有分数。由于您只想计算下三角矩阵的差异,我使用tril(FUN,1)将其余部分设置为零。第二行将计算第二维中矩阵的差异。只需附加X'即可获得所需的矩阵。

答案 3 :(得分:0)

您也可以继续:

% clear all ; clc; %// not generally appreciated
X = [0 20 50 100 150 200 300];
n = length(X)-1;
result = tril(ones(n));
for i = 1:(n-1)
   X_max = X(i+1);    
   for j=1:i
      result(i,j) = result(i,j) .* sqrt(1 - X(j)/X_max) - sqrt(1 - X(j+1)/X_max);
   end    
end

答案 4 :(得分:-4)

首先,使用单元格向量,以便在每个单元格中存储具有不同维度的矩阵(不同长度的水平向量)。

然后,只是一个双循环:

for i = 1:length(X)
  for j = 1:i
     %Your computation
  end
end