如何创建随行索引和数据变化的三角矩阵?
How to create triangular matrix that varies with row indices and data?
我需要计算一些点数。首先我要解释一下这个问题。
我有一个名为 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
.
.
.
谢谢。
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 ];
首先,使用单元格向量,这样你就可以在每个单元格中存储不同维度的矩阵(不同长度的水平向量)。
然后,只是一个双循环:
for i = 1:length(X)
for j = 1:i
%Your computation
end
end
您也可以继续:
% 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
只是添加一个 loop-free 解决方案:
X = [20 50 100 150 200 300];
X2 = [0 X];
outmat = [X.', tril(-diff(sqrt(1-(1./X).'*X2),1,2))];
输出矩阵的 non-trivial 部分是这样工作的:它首先计算矩阵中的 sqrt(1-X(k)/X(l))
种值,本质上是将矩阵创建为 X
的二元积和 X2
(后者是 X
扩展,带有前导 0
元素)。然后,我们计算该矩阵沿其第二维的 diff
:注意 diff
的第二个输入参数给出数值导数的 阶 。然后我们用tril
.
剪掉lower-triangular部分
您的计算无需循环即可完成。由于没有递归计算。以下将起到作用。
B = sqrt(tril(1-bsxfun(@rdivide,[0 X],X'),1));
A = [X' -diff(B,1,2)];
bsxfun
将创建根中的所有分数。由于您只想计算下三角矩阵的差异,因此我使用 tril(FUN,1)
将其余部分设置为零。第二行将计算矩阵在第二维中的差异。只需附加 X'
即可获得所需的矩阵。
我需要计算一些点数。首先我要解释一下这个问题。 我有一个名为 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
.
.
.
谢谢。
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 ];
首先,使用单元格向量,这样你就可以在每个单元格中存储不同维度的矩阵(不同长度的水平向量)。
然后,只是一个双循环:
for i = 1:length(X)
for j = 1:i
%Your computation
end
end
您也可以继续:
% 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
只是添加一个 loop-free 解决方案:
X = [20 50 100 150 200 300];
X2 = [0 X];
outmat = [X.', tril(-diff(sqrt(1-(1./X).'*X2),1,2))];
输出矩阵的 non-trivial 部分是这样工作的:它首先计算矩阵中的 sqrt(1-X(k)/X(l))
种值,本质上是将矩阵创建为 X
的二元积和 X2
(后者是 X
扩展,带有前导 0
元素)。然后,我们计算该矩阵沿其第二维的 diff
:注意 diff
的第二个输入参数给出数值导数的 阶 。然后我们用tril
.
您的计算无需循环即可完成。由于没有递归计算。以下将起到作用。
B = sqrt(tril(1-bsxfun(@rdivide,[0 X],X'),1));
A = [X' -diff(B,1,2)];
bsxfun
将创建根中的所有分数。由于您只想计算下三角矩阵的差异,因此我使用 tril(FUN,1)
将其余部分设置为零。第二行将计算矩阵在第二维中的差异。只需附加 X'
即可获得所需的矩阵。