search for the position of a number inside a cell (cell with existence of empty rows)

1 view (last 30 days)
I am trying to look for each row of 'N' inside a cell.
I am using 'find' but it doesn't seem to work.
I should identify, in the cell, the rows of N. In this case, row 3 and row 19.
parameters = importdata("parameters.mat");
N = [parameters{3,1}; parameters{19,1}];
tt = 1;
for t = 1:height(parameters)
[r,c] = find(parameters{t,1}(1,1) == N(tt,1) & ...
parameters{t,1}(1,2) == N(tt,2) & ...
parameters{t,1}(1,3) == N(tt,3) & ...
parameters{t,1}(1,4) == N(tt,4));
end

Accepted Answer

Star Strider
Star Strider on 10 Feb 2024
Use ismember (since you have the exact values, otherwise ismembertol) and any (here using the default column orientation, dimension = 1) to be inclusive, with cellfun (that loops internally) —
load('parameters')
% whos
parameters
parameters = 21x1 cell array
{'parameters' } {[-23.7557 -202.2222 -189.4345 1.4501]} {[-27.2523 -210.5503 -172.2241 1.2088]} {0x0 double } {0x0 double } {0x0 double } {0x0 double } {0x0 double } {0x0 double } {0x0 double } {0x0 double } {0x0 double } {0x0 double } {0x0 double } {0x0 double } {0x0 double }
N = [parameters{3,1}; parameters{19,1}]; % 'Target' Values
idx = cell2mat(cellfun(@(x)any(ismember(x,N)), parameters, 'Unif',0)); % Logical Index Vector
Result_Index = find(idx) % Numeric Index
Result_Index = 2x1
3 19
Result = parameters(idx) % Result Values
Result = 2x1 cell array
{[-27.2523 -210.5503 -172.2241 1.2088]} {[-31.3830 -213.5605 -165.2437 1.4301]}
There are likely other ways to do this as well.
.

More Answers (1)

VBBV
VBBV on 10 Feb 2024
Edited: VBBV on 10 Feb 2024
Use a | instead of &. OR in place of AND
  2 Comments
VBBV
VBBV on 10 Feb 2024
Using for loop it can be like this
p = load("parameters.mat");
N = [p.parameters{3,1}; p.parameters{19,1}]
N = 2×4
-27.2523 -210.5503 -172.2241 1.2088 -31.3830 -213.5605 -165.2437 1.4301
tt = 1;
for t = 1:height(p.parameters)-1
K = p.parameters{t+1,1};
if ~isempty(K)
if tt == 1 % N(1,:) inside parameter
[r,c] = find((K(1) - N(tt,1)) < 1e-3 & ...
(K(2) - N(tt,2)) < 1e-3 & ...
(K(3) - N(tt,3)) < 1e-3 & ...
(K(4) - N(tt,4)) < 1e-3)
else % N(2,:) inside parameter
tt = tt + 1;
[r,c] = find((K(1) - N(tt,1)) < 1e-3 & ...
(K(2) - N(tt,2)) < 1e-3 & ...
(K(3) - N(tt,3)) < 1e-3 & ...
(K(4) - N(tt,4)) < 1e-3)
end
end
end
r = [] c = []
r = 1
c = 1
r = [] c = [] r = [] c = []
You can try using ismember function to vaoid for loop

Sign in to comment.

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!