How to make simpler this at 'if condition'?

1 次查看(过去 30 天)
There is 'a' vector [6x9].
And I want to define 'ahat' depends on 'ii' value.
For example, if ii=3, 'ahat' use a(1,1),a(2,1),a(3,1),a(4,1),a(5,1),a(6,1)] this value.
But could I make simpler this?
if (ii<5)
ahat=[a(1,1),a(2,1),a(3,1),a(4,1),a(5,1),a(6,1)];
elseif ((4<ii)&&(ii<9))
ahat=[a(1,2),a(2,2),a(3,2),a(4,2),a(5,2),a(6,2)];
elseif ((8<ii)&&(ii<13))
ahat=[a(1,3),a(2,3),a(3,3),a(4,3),a(5,3),a(6,3)];
elseif ((12<ii)&&(ii<17))
ahat=[a(1,4),a(2,4),a(3,4),a(4,4),a(5,4),a(6,4)];
elseif ((16<ii)&&(ii<21))
ahat=[a(1,5),a(2,5),a(3,5),a(4,5),a(5,5),a(6,5)];
elseif ((20<ii)&&(ii<25))
ahat=[a(1,6),a(2,6),a(3,6),a(4,6),a(5,6),a(6,6)];
elseif ((24<ii)&&(ii<29))
ahat=[a(1,7),a(2,7),a(3,7),a(4,7),a(5,7),a(6,7)];
elseif ((28<ii)&&(ii<33))
ahat=[a(1,8),a(2,8),a(3,8),a(4,8),a(5,8),a(6,8)];
else ((32<ii)&&(ii<37))
ahat=[a(1,9),a(2,9),a(3,9),a(4,9),a(5,9),a(6,9)];
end
a = ahat;

采纳的回答

Star Strider
Star Strider 2018-12-26
编辑:Star Strider 2018-12-26
I am not certain this is more efficient than your code, however it takes advantage of the repeating patterns to make it simpler:
a = randi(9, 6, 9); % Create ‘a’
C1 = 4 : 4 : 32;
ahatfcn = @(k) [a(1,k),a(2,k),a(3,k),a(4,k),a(5,k),a(6,k)]; % Create Anonymous Function
for ii = 1 : 40 % Loop Over ‘ii’
if ii < 5
ahat = ahatfcn(1);
else
for k1 = 1:numel(C1)
if ((C1(k1)<ii) && (ii<(C1(k1)+5)))
ahat = ahatfcn(k1+1);
end
end
end
end
a = ahat
It runs without error. I defer to you to determine if it produces the result you want.

更多回答(2 个)

Steven Lord
Steven Lord 2018-12-26
Make some sample data.
a = reshape(randperm(6*9), [6 9])
ii = 15;
Define the cutoffs.
vec = [0 4 8 12 16 20 24 28 32 36];
% or
vec = 0:4:36;
Determine which bin your selected ii falls into. For this sample ii, it falls into bin #4 (between 12 and 16.)
d = discretize(ii, vec)
Create ahat.
ahat = a(1:6, d);
This will even work with a row vector ii.
ii = [15 21 28];
d = discretize(ii, vec)
ahat2 = a(1:6, d)

madhan ravi
madhan ravi 2018-12-26
编辑:madhan ravi 2018-12-26
a = rand(6,9) % some data to test
ii = 6 % according to our expectation the result should be the second column
if ii < 5
ahat = a(:,1) ;
elseif ( 4 < ii ) && ( ii < 9 )
ahat = a(:,2) ;
elseif ( 8 < ii ) && ( ii < 13 )
ahat = a(:,3) ;
elseif ( 12 < ii ) && ( ii < 17 )
ahat = a(:,4) ;
elseif ( 16 < ii ) && ( ii < 21 )
ahat = a(:,5) ;
elseif ( 20 < ii ) && ( ii < 25 )
ahat = a(:,6) ;
elseif ( 24 < ii ) && ( ii < 29 )
ahat = a(:,7) ;
elseif ( 28 < ii ) && ( ii < 33 )
ahat = a(:,8) ;
else ( 32 < ii ) && ( ii < 37 )
ahat = a(:,9) ;
end
a = ahat.'
Gives:
a =
Columns 1 through 7
0.1672 0.9516 0.5479 0.6663 0.9991 0.1904 0.6448
0.1062 0.9203 0.9427 0.5391 0.1711 0.3689 0.3763
0.3724 0.0527 0.4177 0.6981 0.0326 0.4607 0.1909
0.1981 0.7379 0.9831 0.6665 0.5612 0.9816 0.4283
0.4897 0.2691 0.3015 0.1781 0.8819 0.1564 0.4820
0.3395 0.4228 0.7011 0.1280 0.6692 0.8555 0.1206
Columns 8 through 9
0.5895 0.6171
0.2262 0.2653
0.3846 0.8244
0.5830 0.9827
0.2518 0.7302
0.2904 0.3439
ii =
6
a =
0.9516 0.9203 0.0527 0.7379 0.2691 0.4228

类别

Help CenterFile Exchange 中查找有关 Microelectronics, Photonics and Nanotechnology 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by