필터 지우기
필터 지우기

Info

이 질문은 마감되었습니다. 편집하거나 답변을 올리려면 질문을 다시 여십시오.

How to assign mutliple vectors to matrix diagonals

조회 수: 2 (최근 30일)
A K
A K 2016년 10월 18일
마감: MATLAB Answer Bot 2021년 8월 20일
I have 3 vectors that I want to assign as diagonals to a matrix. Vector A is the center diagonal, Vector B is above the center diagonal, Vector C is below the centre diagonal.
So my final matrix should have 3 diagonals.
Now, say that these vectors each have 3 separate columns (now a matrix), how would i go about producing 3 matrices that demonstrate the above? How can i do this? I have tried to use the gallery('tridiag',A,B,C,
B=ones(3,22);
M=zeros(23);
n=1; k=1;
for n=1:3;
for k=1:23
for g=1:22;
super_diag(n,g)=B(n,g);
diag(n,k)=-A(n,k); % -ve to make values -ve
sub_diag(n,g)=C(n,g);
end
M{n}=gallery('tridiag',sub_diag(n,g),diag(n,k),super_diag(1,g));
end
end
This does not seem to work, any ideas where I have gone wrong?

답변 (1개)

Guillaume
Guillaume 2016년 10월 18일
I have no idea what you're trying to do with your code, it makes no sense, from the comment about creating a sparse matrix followed by no sparse matrix creation, to cell indexing into a matrix, through the pointless copying of scalar values.
Trying to decode what you say, you have 3 matrices (not vectors), A, B and C with 3 columns each and you want to create 3 tridiagonal matrices from the corresponding columns of each. In which case:
A = [1:9; 11:19; 21:29]'; %demo data
B = [101:110; 111:120; 121:130]'; %demo data
C = [201:209; 211:219; 221:229]'; %demo data
assert(size(A, 2) == size(B, 2) && size(A, 2) == size(C, 2), 'A, B, and C must have the same number of columns');
assert(size(A, 1) == size(C, 1) && size(B, 1) == size(A, 1) + 1, 'A and C must have the same number of rows. B must have one more row');
m = arrayfun(@(colidx) gallery('tridiag', A(:, colidx), B(:, colidx), C(:, colidx)), 1:size(A, 2), 'UniformOutput', false)
  댓글 수: 2
A K
A K 2016년 10월 18일
yes, that's exactly what i'm trying to do, but i'm trying to approach it in the general case, which is why i'm indexing and using a loop.
Thanks for your answer.
Guillaume
Guillaume 2016년 10월 18일
You're not going to get any more generic than what I've written. Notice that none of the sizes are hardcoded (unlike your loop solution). The code will work with A, B and C of any height as long as B is one element taller than A and C, and with any number of columns as long as A, B and C have the same number. It will generate as many matrices as there are columns.
This is ultra generic. I actually stated the only conditions required for the code to work in the two assert.

이 질문은 마감되었습니다.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by