How do I generate a given Matrix in one command?

37 ビュー (過去 30 日間)
marciuc
marciuc 2011 年 2 月 23 日
コメント済み: DGM 2023 年 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 件のコメント
Paulo Silva
Paulo Silva 2011 年 2 月 24 日
+1 vote to marciuc just because of the beer :)
Jan
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.

サインインしてコメントする。

回答 (17 件)

Jan
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)
Jos (10584) 2011 年 2 月 23 日
vote +1

サインインしてコメントする。


Sean de Wolski
Sean de Wolski 2011 年 2 月 23 日
Probably the most compact:
A = toeplitz([1 1 0 0 0])
  1 件のコメント
Jan
Jan 2011 年 2 月 23 日
This is the most compact command, except for the ambitious RAND apporach. I vote it.

サインインしてコメントする。


Jan
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 件のコメント
Andrew Newell
Andrew Newell 2011 年 2 月 23 日
A small price to pay for elegance!
Jiro Doke
Jiro Doke 2011 年 2 月 23 日
Or if you have MATLAB R2008b or newer,
A = randi([0 1], 5)

サインインしてコメントする。


Jan
Jan 2011 年 2 月 23 日
A = dec2bin([24 28 14 7 3]) - '0'
  4 件のコメント
David Young
David Young 2011 年 2 月 24 日
dec2bin('vzlea'-'^')-'0'
Jan
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
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
Sean de Wolski 2011 年 2 月 23 日
Nice job with your current favorite!

サインインしてコメントする。


Kenneth Eaton
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
Jan 2011 年 2 月 28 日
*You* have suggested it now. So I can't believe it now, too. +1

サインインしてコメントする。


Jan
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 件のコメント
Sean de Wolski
Sean de Wolski 2011 年 2 月 23 日
Can I have your beer ?!
Matt Tearle
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
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')
answer=input('Press y and Enter if your dare to try','s')
if (strcmp(answer,'y'))
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
Sean de Wolski 2011 年 2 月 23 日
Yay! The infinite monkey makes its second appearance in a week.

サインインしてコメントする。


Walter Roberson
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
Jan 2011 年 2 月 25 日
Thanks for line breaking. This solution will drive marciuc's teacher crazy. Such ugly! +1

サインインしてコメントする。


Jan
Jan 2011 年 2 月 23 日
A = abs(bsxfun(@minus, 1:5, transpose(1:5))) < 2

Jan
Jan 2011 年 2 月 23 日
A = 1 - (tril(ones(5), -2) + triu(ones(5), 2))

Jan
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.

Paulo Silva
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;

Matt Fig
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 件のコメント
Jan
Jan 2011 年 2 月 25 日
Brr.
Matt Fig
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.

サインインしてコメントする。


DGM
DGM 2023 年 2 月 23 日
編集済み: DGM 2023 年 2 月 23 日
I can't believe that everyone has missed the obvious solution!
rng(46783490); randi([0 1],5,5)
ans = 5×5
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
so simple!
  2 件のコメント
Stephen23
Stephen23 2023 年 2 月 23 日
+1 very nice. What magic did you use to reverse engineer that?
DGM
DGM 2023 年 2 月 23 日
I made use of the classic "commit to brute force and then go to bed" algorithm.

サインインしてコメントする。


Paulo Silva
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

marciuc
marciuc 2011 年 2 月 24 日
Thank you guys...regards from Romania
  1 件のコメント
Jan
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.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeHistorical Contests についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by