How to create a specific matrix from a regular matrix

1 次查看(过去 30 天)
I wanna create a specific matrix B from a regular matrix A as following in Matlab. Is there anyone who can help me to use a better method to generate it, not for loop? The matrix size could be various. In example, it's 3 by 3 matrix. It could be 3 by n matrix. Thanks
A=[ a b c;
d e f;
g h i]
B=[a 0 0;
d b 0;
g e c;
0 h f;
0 0 i]

采纳的回答

Azzi Abdelmalek
Azzi Abdelmalek 2013-8-29
A=[ 1 2 3;4 5 6;7 8 9]
[n,m]=size(A)
B=[A;zeros(n-1,m)]
out=cell2mat(arrayfun(@(x) circshift(B(:,x),[x-1 0]),1:m,'un',0))
  6 个评论
Cedric
Cedric 2013-8-29
You wrote 3x1000 actually, which should produce a significantly sparse 1002x1000 output, whereas the 1000x3 should produce a significantly dense 1002x3 output.

请先登录,再进行评论。

更多回答(4 个)

Cedric
Cedric 2013-8-29
编辑:Cedric 2013-8-29
Here is a one-liner. Assume
>> A = randi(20, 3, 4) % Example.
A =
19 16 2 16
6 8 2 19
16 12 11 3
then
>> B = full(spdiags(A.', 1-(1:size(A,1)), sum(size(A))-1, size(A,2)))
B =
19 0 0 0
6 16 0 0
16 8 2 0
0 12 2 16
0 0 11 19
0 0 0 3
is what you are looking for. Note that it is not the fastest solution, but it is appropriate for A matrices with nCols >> nRows. In such case, remove the call to FULL and keep the solution sparse.

Image Analyst
Image Analyst 2013-8-29
Very simple:
B = [A(1,1), 0, 0;
A(2,1), A(1,2), 0;
A(3,1), A(2,2), A(1,3);
0, A(3,2), A(2,3);
0, 0, A(3,3)];
  3 个评论
Pierre
Pierre 2013-8-29
This is not what I expected. This matrix size could be various dynamically, for example: 3 by 7, 3 by 21. Therefore, I need few code to create it. Thanks
Image Analyst
Image Analyst 2013-8-29
What would you expect this to give as a result:
A=[ 1 2 3 4 5 6;
7 8 9 10 11 12;
13 14 15 16 17 18]

请先登录,再进行评论。


Jos (10584)
Jos (10584) 2013-8-29
Just for fun and to show the power of logical indexing:
A = reshape(1:12,3,[]).' % input
[m,n] = size(A) ;
tmp = cumsum(cumsum(eye(n+m-1,n)))
B = double(tmp & (tmp < m+1))
B(logical(B)) = A

Andrei Bobrov
Andrei Bobrov 2013-8-29
编辑:Andrei Bobrov 2013-8-29
[m,n] = size(A);
B = ones(m+n-1,n);
p = tril(B) & rot90( tril(B),2);
B = B - 1;
B(p) = A;

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by