Finding contents of cell in another one

26 ビュー (過去 30 日間)
babak
babak 2012 年 9 月 19 日
Hi I have a matrix that is called file1=[1109x1] and another matrix that is caled rxn=[1170x7] i need to know if the contents of the 'file1' exist in column#5 of the rxn and if the answer is yes, the whole content of the related row in 'rxn' would be copied to a new matrix, what should i do? Please help me on this issue Thank you alot!
[EDITED, Jan, moved from comment sections]
Here is what my data exactly is: File1 contains 1column x 1109rows and each cell contains numbers like this: 2.11.7.8
Rxn contains 7column x 1170rows. In every cells of column#5 exists numbers like what it was in file1 (2.11.7.8) I am going to compars every cells of file1 with cells of rxn column#5 and if the numbers were exactly the same, the whole content of the related row in rxn would be copied to a new matrix Please note that i need the exact properties of each cell
  10 件のコメント
babak
babak 2012 年 9 月 21 日
編集済み: babak 2012 年 9 月 21 日
i used this code but it didnt work:
for i=1:1170
g=find(ismember(rxn{i},file1{i}));
end
if numel(g)>0
for j=1:5
x=(rxn(5));
s=[s(x);:];
end
end
Matt Tearle
Matt Tearle 2012 年 9 月 24 日
rxn is a 2-dimensional cell array, so you should be indexing into the 5th column, which you are not. However, you should not need to do this in a loop. The code I provided earlier should work. If not, please explain what isn't working and why. For starters, what do you get if you do this:
idx = ismember(rxn(:,5),file1);
nnz(idx)

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

回答 (4 件)

Jan
Jan 2012 年 9 月 19 日
編集済み: Jan 2012 年 9 月 19 日
file1 = randi(1000, 1, 1109); % Test data
rxn = randi(1000, 1170, 7);
match = ismember(rxn(:, 5), file1);
result = rxn(match, :);
  6 件のコメント
babak
babak 2012 年 9 月 19 日
The contents of rxn are some words, but this code gives me some numbers
Jan
Jan 2012 年 9 月 19 日
編集済み: Jan 2012 年 9 月 19 日
In your question I find "rxn=[1170x7]", which usually means that the data is a matrix of type double. If you use a different input, it would be a really good idea to explain this explicitely. Otherwise guessing what you are looking for wastes your and my time.
Of course my method replies numbers. I used numbers as test data as explained in the comment. It should not be to hard to omit the two lines containing randi, such that your data are processed.

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


Shane
Shane 2012 年 9 月 19 日
You could use ismember and indexing values to determine which rxn columns have corresponding values within file1 but this can also be solved using a set of loops as shown:
count= 0;
for i = 1 : length(file1)
for j = 1 : length(rxn)
if file1(i) == rxn(j,5)
count = count + 1;
finalMatrix(count,:) = rxn(j,:);
end
end
end
The finalMatrix will be a matrix containing all of the rows of rxn that have their column 5 values identified within file1
  6 件のコメント
babak
babak 2012 年 9 月 19 日
Do you meane i should add yor allocations to shane's code? If yes at which steps?
Jan
Jan 2012 年 9 月 19 日
Shane's code assumes also, that your data are double matrices. If you are talking about cell strings, please specify this. A small set of example data would be a good idea also.

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


Matt Tearle
Matt Tearle 2012 年 9 月 19 日
If I understand your intent correctly, you want every row of rxn for which the value in the 5th column is one of values in the vector file1. If so:
result = rxn(ismember(rxn(:,5),file1),:);
  7 件のコメント
Matt Tearle
Matt Tearle 2012 年 9 月 19 日
As Jan explained, the lines
file1 = randi(1000, 1, 1109);
rxn = randi(1000, 1170, 7);
create some test data (because, funnily enough, we don't have access to your actual data). Given your description of your data (an 1109-element vector and a 1170-by-7 matrix),
result = rxn(ismember(rxn(:,5),file1),:);
does what you asked. If it is not working as you expected, you need to explain what you expected, and exactly what your data looks like and what you are doing to it.
BTW, that line of code should work on virtually any data type. However, if you're working with cell arrays, it will depend on the contents. Again, you need to describe your data precisely.
Matt Tearle
Matt Tearle 2012 年 9 月 20 日
From your description of the data, it sounds a lot like you have a cell array (as Jan says, "2.11.7.8" could not be stored as a numeric type, so it is probably a string, and you mentioned that the contents of rxn are "some words"). If rxn is a 1170-by-7 cell array, and file1 is a 1109-by-1 cell array, then the code I gave should still work.

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


Javier
Javier 2012 年 9 月 21 日
編集済み: Javier 2012 年 9 月 21 日
Hello Babak
Ok big issue here but not impossible. The following procedure works in Matlab R2012a.
Step 1
Import 3 files: One will be Rxn (7 columns), File1 and other called "Var1" will be column 5 of Rxn. When you import this to Matlab you will have string information not data. Because the information is in Excel (for example) use the function num2str in the import process.
Step 2
Now, for each string in File1, we begging the search in Var1. This will work for the search of the first string in File1.
for i=1:1170
R(i,1)=sum(find(A(i,:)==File1(1,:)),2);
end
How R works. For 2.11.7.8 we have 8 characters. Then, if R= 36 all the string match and we find what we are looking for. If you remove the sum, an error will appear. At the end I provide a code that you can check. If the number of characters change, establish a condition in Step 3 according to string data search.
Step 3
R is column vector. Find in R the value 36. Remember, 2.11.7.8 we have 8 characters, and the sum of 1 to 8 is 36.
RR=find(R==36) %Now you have the rows
Step 4
New matrix and copy process
for i=1:size(RR,1)
Newm(i,:)=Rxn(RR(i,1),:)
end
Code
%Step 1 Search a value (A(1,:)). This is the first value in A. It could be the first element of File1
a=randn(100,4);
A=[num2str(abs(round(a(:,1)))),repmat('.11.',100,1),num2str(abs(round(a(:,2))))];
B=[num2str(abs(round(a(:,3)))),repmat('.11.',100,1),num2str(abs(round(a(:,4))))];
%My Rxn matrix (2 columns A,B)
Rxn=[A,B];
Var1=A; %search in this column
File1=A(1,:) %search this data
%Step 2
for i=1:size(Rxn,1)
R(i,1)=sum(find(Var1(i,:)==File1(1,:)),2);
end
%Step 3
RR=find(R==21) %Data are like 1.11.1, 6 characters and sum(1 to 6)=21
%Step 4
for i=1:size(RR,1)
Newm(i,:)=Rxn(RR(i,1),:)
end
Feel free to make a comment and verify that the code supplied works before comment.
Regards
Javier

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by