how to replace elements in top third, middle third, and bottom third of matix

This question is soft-locked: new answers that are equivalent to already posted answers may be deleted without prior notice.
My task is the following:
Write a function called trio that takes two positive integer inputs n and m. The function returns a 3n-by-m matrix called T. The top third of T (an n by m submatrix) is all 1s, the middle third is all 2-s while the bottom third is all 3-s. See example below:
M = trio(2,4)
M =
1 1 1 1
1 1 1 1
2 2 2 2
2 2 2 2
3 3 3 3
3 3 3 3
This is the code that I wrote, but it only works for T = trio (4,3). I want my code to work for any input of n,m.
function T = trio (n, m)
T = randi (10, (3 * n) , m);
T ( 1:n , :) = 1;
T ( (n+1):(end-(n-1)) , :) = 2;
T ( (n+3):end, :) = 3;
end
How is it possible to call out only top third, middle third, and bottom third of any matrix?
Thank you in advance.

6 Comments

function T = trio (n, m)
T = randi (10, (3 * n) , m);
T ( 1:n , :) = 1;
T ( (n+1):(2*n) , :) = 2;
T ( ((2*n)+1):end, :) = 3;
end
function k=trio(a,b)
x=ones(a,b);
y=2*ones(a,b);
z=3*ones(a,b);
k=[x y z]
end
For random input use k=trio(round(rand),round(rand))
function M=trio(n,m)
p=3*n;
q=(1/3)*p;
M=[ones(q,m);2*ones(q,m);3*ones(q,m)];
function T=trio(n,m)
T=[ones(n,m) ; (2*ones(n,m)) ; (3*ones(n,m))];
end
I'm going to delete duplicate answers. I will consider the list below as the list of solutions. From the current answer section I will only leave the top one for each of these:
  1. all answer with general advice about how to solve the question
  2. answers with more than 1 vote
  3. allocating the full size array with ones or zeros and indexing into it, writing the correct values
  4. allocating the full size array with a non-standard function (like randi) and indexing into it, writing the correct values
  5. 3 and 4, but for the three parts separately, requiring concatenation
  6. kron (posted in a comment)
  7. repmat combined with implicit expansion
If new valid solutions are posted I will of course leave those as well, although I think the non-esoteric solutions may be exhausted.

 Accepted Answer

Your row indexing is wrong.
The first n rows are 1:n which you have correct.
The second n rows indexing is n more that the first set, so simply add n: n + (1:n)
The third n rows indexing is n more than the second set, which I will let you figure out (it's pretty simple)

3 Comments

Thank you so much James!!!! I was able to figure out the third n rows.
I really appriciate your time.
function T = trio (n, m)
T =randi (10, (3 * n) , m)
T ( 1:n , :) = 1
T ( (n+1):2*n , :) = 2
T ( (2*n+1):end, :) = 3
end

More Answers (6)

function T = trio (n, m)
T = randi (10, (3 * n) , m);
T (1:n,:) = 1;
T ((n+(1:n)),:) = 2;
T (n+(n+(1:n)):end,:) = 3;
end

2 Comments

% sir this is right code instead of your code.
function T=trio(n,m)
T=randi(10,(3*n),m);
T(1:n,:)=1;
T((n+(1:n)),:)=2;
T((n+(n+(1:n))),:)=3;
end
t
% That's my trio code.
%From India.
function T=trio(n,m)
x=ones(n,m);
y=2*x;
z=3*x;
T=[x;y;z];
end

7 Comments

To get a matrix with all the numbers which are one
It's so easy and presence of mind,smart thinking.Thank you
that function you made I see it's very restricted.. I wonder if it'd work for matrices of larger dimensions !
function T=trio(n,m)
T=[ones(n,m);2*ones(n,m);3*ones(n,m)]
end

3 Comments

+1 straightfoward solution. I might as well leave this general solution here too:
>> trio = @(n,m) kron([1;2;3],ones(n,m));
>> trio(2,4)
ans =
1 1 1 1
1 1 1 1
2 2 2 2
2 2 2 2
3 3 3 3
3 3 3 3
this will work for all inputs
function T= trio(n,m);
T1= ones(n,m);
T2= 2*ones(n,m);
T3= 3*ones(n,m);
T= [T1;T2;T3];

2 Comments

good try, but i dont think function will return 3n by m matrix.
"but i dont think function will return 3n by m matrix."
Please show any positive integer values of m & n for which this function does not return a 3n by m matrix.
function T=trio(n,m)
T(3*n,m)=3; % or you can use random no. generation...but since we are assigning alues anyway , this vl work fine !
T(1:n,:)=1;
T((n+1):2*n,:)=2;
T((2*n+1):3*n,:)=3;
end
hope this'll help, welcome !
function d = trio(n,m)
a = randi(1,n,m);
b = 2 + rand(n,m)*0;
c = 3 + rand(n,m)*0;
d = [a;b;c];
end

3 Comments

Sure, but why use rand()/randi() to simply preallocate an array? Why would people upvote it?
I mean, if the name of the game is embellishment, you could always go further and make it obvious.
trio(2,4)
ans = 6×4
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
function d = trio(n,m)
a = imread('peppers.png');
t = 1:size(a,3)-1;
a = imgaussfilt(a,mean(t));
x = mod(double(a),permute(size(a,t(1))-(2298/6:-1:2667/7),[1 3 2]));
q = max(x,[],ones(1,2)+[0 1]) + norm(ones(1,size(a,3)))/(2*cosd(30));
c = reshape(q,1,[]).*ones(n*m,round(pi));
d = permute(reshape(c,m,[]),[fliplr(t) sum(t)]);
end
... but that's a lot of work for nothing.
function d = trio_no_baloney(n,m)
d = ones(n*m,3).*(1:3);
d = reshape(d,m,[]).';
end
trio_even_less_baloney = @(n,m) repelem((1:3).',n,m);
n=2;m=4;
trio_even_less_baloney(n,m)
ans = 6×4
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
Although your point is absolutely valid.
Yeah, maybe I should've called it trio_reduced_baloney()
I figured repelem() was already officially exhausted. Reshaping/permuting might not be minimal, but it was a reasonable basic option that was still fair game.

This question is locked.

Categories

Asked:

on 1 May 2019

Locked:

Rik
on 9 Jul 2024

Community Treasure Hunt

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

Start Hunting!