# How do I generate a given Matrix in one command?

조회 수: 34(최근 30일)
marciuc 2011년 2월 23일
I have to generate a matrix A = [1 1 0 0 0; 1 1 1 0 0; 0 1 1 1 0; 0 0 1 1 1; 0 0 0 1 1]
writing a single command.
Teacher told as some helpful commands would be
EYE(m,n)
ONES(m,n)
ZEROS(m,n)
RAND(m,n)
I give you a beer
##### 댓글 수: 4표시숨기기 이전 댓글 수: 3
Jan 2011년 2월 25일
+1: If you can explain how all solutions given here work, you will pass the complete Matlab course based on just one question. Every single answer is funny, but all answers together are serious.

댓글을 달려면 로그인하십시오.

### 답변(16개)

Jan 2011년 2월 23일
Refering to your former post, which has been deleted now: I know also, who you are: you are marciuc.
At first I suggest this:
A = [1 1 0 0 0;1 1 1 0 0;0 1 1 1 0;0 0 1 1 1;0 0 0 1 1]
This is a single command and it is the most efficient solution: No temporary memory, no overhead for calling commnad, and easy to debug. There is no better solution.
##### 댓글 수: 1표시숨기기 없음
Jos (10584) 2011년 2월 23일
vote +1

댓글을 달려면 로그인하십시오.

Sean de Wolski 2011년 2월 23일
Probably the most compact:
A = toeplitz([1 1 0 0 0])
##### 댓글 수: 1표시숨기기 없음
Jan 2011년 2월 23일
This is the most compact command, except for the ambitious RAND apporach. I vote it.

댓글을 달려면 로그인하십시오.

Jan 2011년 2월 23일
Give the beer to your teacher. He is obviously funny if he suggests RAND - but it really works:
A = round(rand(5))
There is at least a certain chance to get the correct answer.
##### 댓글 수: 5표시숨기기 이전 댓글 수: 4
Jiro Doke 2011년 2월 23일
Or if you have MATLAB R2008b or newer,
A = randi([0 1], 5)

댓글을 달려면 로그인하십시오.

Jan 2011년 2월 23일
A = dec2bin([24 28 14 7 3]) - '0'
##### 댓글 수: 4표시숨기기 이전 댓글 수: 3
Jan 2011년 2월 24일
There is the vuvuzela again. The question is obviously more diabolic than I've expected. Again you see: Subtracting zero can reveal the clandestine information.

댓글을 달려면 로그인하십시오.

Matt Tearle 2011년 2월 23일
A = full(gallery('tridiag',ones(1,4),ones(1,5),ones(1,4)))
But my current favorite:
A = 1-reshape(mod(floor((1:25)/3),2),5,5)
##### 댓글 수: 1표시숨기기 없음
Sean de Wolski 2011년 2월 23일
Nice job with your current favorite!

댓글을 달려면 로그인하십시오.

Kenneth Eaton 2011년 2월 28일
I can't believe no one suggested dilation:
A = imdilate(eye(5),ones(2));
Or convolution:
A = sign(conv2(eye(5),ones(2),'same'));
A = sign(filter2(ones(2),eye(5)));
##### 댓글 수: 1표시숨기기 없음
Jan 2011년 2월 28일
*You* have suggested it now. So I can't believe it now, too. +1

댓글을 달려면 로그인하십시오.

Jan 2011년 2월 23일
A general method to create a diagonal matrix is using DIAG (as the example in "help diag" explains):
A = diag(ones(1, 5)) + diag(ones(1,4), 1) + diag(ones(1,4), -1);
You can discuss, if this is still "a single command".
I do not drink beer. But you can ask your teacher to send me the points gained by solving this homework.
##### 댓글 수: 2표시숨기기 이전 댓글 수: 1
Matt Tearle 2011년 2월 23일
You can have all the beer that marciuc's teacher sends me. How's that for a deal?

댓글을 달려면 로그인하십시오.

Paulo Silva 2011년 2월 23일
Here's probably the most awesome way to generate the matrix :D
disp('I dare you to try the Infinite monkey matrix')
disp('Congratulations your are not a coward')
disp('Good luck')
pause(1)
disp('Please wait or press CTRL+C to cancel')
disp('but canceling the operation makes you a coward!!')
a=[1 1 0 0 0; 1 1 1 0 0; 0 1 1 1 0; 0 0 1 1 1; 0 0 0 1 1];
w=0;b=zeros(5,5);
while ~isequal(a,b)
b=randi([0 1],5,5);
w=w+1;
end
disp('Congratulations we found the Infinite monkey matrix for you')
b
disp('after')
w
disp('attempts')
else
disp('You are a coward!!!!')
end
##### 댓글 수: 1표시숨기기 없음
Sean de Wolski 2011년 2월 23일
Yay! The infinite monkey makes its second appearance in a week.

댓글을 달려면 로그인하십시오.

Walter Roberson 2011년 2월 25일
EDIT: line-broken per request.
eval(char(mod(1.0599.^ ...
'i<o<ZC<C<d<d<d_C<C<C<d<d_d<C<C<C<d_d<d<C<C<C_d<d<d<C<Cv', ...
96)))
##### 댓글 수: 1표시숨기기 없음
Jan 2011년 2월 25일
Thanks for line breaking. This solution will drive marciuc's teacher crazy. Such ugly! +1

댓글을 달려면 로그인하십시오.

Jan 2011년 2월 23일
A = abs(bsxfun(@minus, 1:5, transpose(1:5))) < 2
##### 댓글 수: 0표시숨기기 이전 댓글 수: -1

댓글을 달려면 로그인하십시오.

Jan 2011년 2월 23일
A = 1 - (tril(ones(5), -2) + triu(ones(5), 2))
##### 댓글 수: 0표시숨기기 이전 댓글 수: -1

댓글을 달려면 로그인하십시오.

Jan 2011년 2월 24일
I cannot resist to post some variation of the DEC2BIN theme:
A = dec2bin('8<.''#' - 32) - '0'
A = dec2bin('FJ<51' - 46) - '0'
But finally you can even omit the first subtraction, because DEC2BIN operates on CHAR vectors also, but you cannot type the non-printables directly:
q = [100 101 99 50 98 105 110 40 39 24 28 14 7 3 39 41 45 39 48 39];
clipboard('copy', char(q))
==> Ctrl-v in the command window
>> dec2bin('#####')-'0'
Here the '#' are the non-printables with the ASCII codes [24,28,14,7,3]. You can write them even in a M-file.
##### 댓글 수: 0표시숨기기 이전 댓글 수: -1

댓글을 달려면 로그인하십시오.

Paulo Silva 2011년 2월 24일
b=[0 0 1 1 1
0 0 0 1 1
1 0 0 0 1
1 1 0 0 0
1 1 1 0 0]
A=~b;
##### 댓글 수: 0표시숨기기 이전 댓글 수: -1

댓글을 달려면 로그인하십시오.

Matt Fig 2011년 2월 24일
One line, anyway. And since the array is at least dynamically pre-allocated, the code is fast.
for ii = 5:-1:1,for jj = min(ii+1,5):-1:max(ii-1,1),A(ii,jj) = 1;end,end
##### 댓글 수: 2표시숨기기 이전 댓글 수: 1
Matt Fig 2011년 2월 25일
LOL Jan. I am surprised that such an answer is faster than both the BSXFUN and EYE + DIAG + DIAG solutions, even for N=1000.

댓글을 달려면 로그인하십시오.

Paulo Silva 2011년 2월 23일
diag(diag(eye(4,4)),1)+diag(diag(eye(4,4)),-1)+eye(5,5)
or
diag(ones(1,4),1)+diag(ones(1,4),-1)+eye(5,5)
It's similar to the Jan solution above
##### 댓글 수: 0표시숨기기 이전 댓글 수: -1

댓글을 달려면 로그인하십시오.

marciuc 2011년 2월 24일
Thank you guys...regards from Romania
##### 댓글 수: 1표시숨기기 없음
Jan 2011년 2월 24일
Please do us the favor and accept one of the answers. Or let your teacher choose one.
Beside the fun, this thread will be really helpful, because it describes the creation of tridiagonal matrices exhaustively.
I really hope you had some fun also.

댓글을 달려면 로그인하십시오.

### 범주

Find more on Linear Algebra in Help Center and File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by