Как создать треугольную матрицу, которая зависит от индексов строк и данных?

Мне нужно рассчитать несколько баллов. Сначала я собираюсь объяснить проблему. У меня есть вектор данных с именем 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 ответов

Решение

Просто чтобы добавить решение без петель:

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 а также X2 (последнее X продлен с ведущим 0 элемент). Затем мы вычисляем diff этой матрицы вдоль ее второго измерения: будьте осторожны, что второй входной параметр diff дает порядок числовой производной. Затем вырезаем нижнюю треугольную часть tril,

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 ];

Ваш расчет можно сделать без петель. Как нет рекурсивного расчета. Следующий сделает свое дело.

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

bsxfun создаст все фракции, которые у вас есть внутри ваших корней. Поскольку вы хотите только рассчитать различия нижней треугольной матрицы, я использую tril(FUN,1) установить остаток на ноль. Вторая строка будет вычислять различия вашей матрицы во втором измерении. Просто добавить X'и у вас есть желаемая матрица.

Вы также можете продолжить:

% 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

Прежде всего, используйте вектор ячейки, чтобы вы могли хранить матрицу с разным измерением в каждой ячейке (горизонтальные векторы разной длины).

А потом просто двойной цикл как:

for i = 1:length(X)
  for j = 1:i
     %Your computation
  end
end
Другие вопросы по тегам