how to control the length of indexed array element?

1 view (last 30 days)
m=[1 2 3 4];
m_d=0.5.*ones(1,length(m));
for i=1:length(m)
m_xx=m(i)(1:(length(m(i))*m_d(1))); %error is here
end
I want to control an indexed array element length for my project and I really can't get the correct syntax for this
  2 Comments
Tommy
Tommy on 10 May 2020
Can you explain a bit more? What should m_xx equal after each iteration?
Mohamed Salah
Mohamed Salah on 10 May 2020
Edited: Mohamed Salah on 10 May 2020
m_xx should be equal to m(i) (from 1 to the last bit of m(i)) multiplied by factor m_d(1)

Sign in to comment.

Accepted Answer

per isakson
per isakson on 10 May 2020
Edited: per isakson on 11 May 2020
"(from 1 to the last bit of m(i)) "
Here is my shot in the dark
%%
m = uint8([1,2,3,4]);
len = length(m);
m_d = 0.5*ones(1,len);
m_xx = cell(1,len);
for jj = 1 : len
m_xx{jj} = bitget( m(jj), [1:8], 'uint8' );
end
%%
m_xx{1}
m_xx{4}
outputs
ans =
1×8 uint8 row vector
1 0 0 0 0 0 0 0
>> m_xx{4}
ans =
1×8 uint8 row vector
0 0 1 0 0 0 0 0
Comments
  • bitget only takes whole numbers (I chose uint8 to keep the output short)
  • cannot [not meaningsful to] multiply an integer with 0.5
  • I stored the result in a cell array, but there are other alternatives
In reponse to comment
Now I understand your question, I think.
Mehmed Saad have listed problems with your puzzling statement.
Your statement
m_xx = a(1:(length(a)*.5));
works because the length(a) is an even number.
Try
%%
a=[1 2 3 4];
b=[3 4 5 6];
c=[1 2 4 5];
m=[a b c]; % concatenates a, b and c into a row of length 12. That's less useful.
%%
m = { a, b, c }; % cell array. Comma is more readable than space
len = length( m );
m_xx = cell( 1, len ); % pre-allocate cell array for holding the results
for jj = 1 : length( m ) % i is the imaginary unit
m_xx{jj} = m{jj}( 1 : length(m{jj})*0.5 );
end
and
>> m_xx{:}
ans =
1 2
ans =
3 4
ans =
1 2
Comment
The statement in the for-loop looks a lot like your statement. However, you missed
  • that m and m_xx need to be cell arrays and
  • the difference between () and {} when using cell arrays.
  3 Comments
Tommy
Tommy on 11 May 2020
Ah. See if this gets you where you're going:
a=[1 2 3 4];
b=[3 4 5 6];
c=[1 2 4 5];
m={a;b;c}; % a, b, and c can be different lengths
for i=1:numel(m)
m_xx=m{i}(1:end/2)
end

Sign in to comment.

More Answers (1)

Mehmed Saad
Mehmed Saad on 10 May 2020
Edited: Mehmed Saad on 10 May 2020
  1. you cannot feed 0 as array index it will give error
  2. for loop runs from 0 to length of m which will make it run for 5 iterations instead of 4
  3. m(i) will give you ith index. 1:length(m(i)) will be 1 as length(m(i)) will always be 1
  4. in order to access m's index from 1 to i, you have to replace all that code with m(1:i). also start for loop from 1 and not from 0
  5 Comments
Mohamed Salah
Mohamed Salah on 11 May 2020
length of m in my code is 4000 so that's not the problem
in your last element of the the list you said no operator so the error appears so that's exactly my question I don't know the operator to make m_xx half the length of m(1)
Mohamed Salah
Mohamed Salah on 11 May 2020
that's the comment I wrote on the answer below that maybe help to clarify things
look suppose that
a=[1 2 3 4];
b=[3 4 5 6];
c=[1 2 4 5];
m=[a b c];
So I want to get m(1) half length -for example-
so I'd write
m_xx=m(1)(1:(length(m(1))*0.5) %and here comes the error
an working example without the for loop I want to make is to take every element of m directly like this
m_xx=a(1:(length(a)*.5));
i want m_xx=[1 2] from the first half of a

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!