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

1 回表示 (過去 30 日間)
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

採用された回答

Star Strider
Star Strider 2024 年 2 月 10 日
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.
.

その他の回答 (1 件)

VBBV
VBBV 2024 年 2 月 10 日
編集済み: VBBV 2024 年 2 月 10 日
Use a | instead of &. OR in place of AND
  2 件のコメント
Alberto Acri
Alberto Acri 2024 年 2 月 10 日
編集済み: Alberto Acri 2024 年 2 月 10 日
I need to know if N(1,:) is inside 'parameters'
VBBV
VBBV 2024 年 2 月 10 日
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

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

カテゴリ

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

製品


リリース

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by