Arrays 如何在给定特定条件的情况下将元素传递到不同的单元格数组
我使用的是Arrays 如何在给定特定条件的情况下将元素传递到不同的单元格数组,arrays,matlab,string-matching,similarity,cell-array,Arrays,Matlab,String Matching,Similarity,Cell Array,我使用的是Matlab,我有两个不同的单元阵列,其中包含几个元素 主要的和次要的。虽然行数和顺序不相等,但两个单元格中都有一个共同的元素。我想要的是,每次验证一个条件时,从次要单元“传递”到主要单元的X个额外元素。条件是Y列(来自主单元格)和Z列(来自次单元格)匹配。例如: Primary cell array: ABC 970508 … FED 970524 … BAC 970601 … IGH 970606 … Secondary cell array IGH FINANCE B
Matlab
,我有两个不同的单元阵列,其中包含几个元素
主要的和次要的。虽然行数和顺序不相等,但两个单元格中都有一个共同的元素。我想要的是,每次验证一个条件时,从次要单元“传递”到主要单元的X个额外元素。条件是Y列(来自主单元格)和Z列(来自次单元格)匹配。例如:
Primary cell array:
ABC 970508 …
FED 970524 …
BAC 970601 …
IGH 970606 …
Secondary cell array
IGH FINANCE BANK1
FED HEALTH PILLS
ABC FINANCE BANK3
What I would like to get in the ‘new’ primary cell array:
ABC 970508 FINANCE BANK3
FED 970524 HEALTH PILLS
BAC 970601 …
IGH 970606 FINANCE BANK1
有人能帮我吗?我相信,如果您使用数据库,您需要做的是内部连接。加入单元阵列将在中进行更全面的讨论,但将其应用到您的特定情况下,以下代码将为您提供所需的内容:
d1 = {'ABC' 970508
'FED' 970524
'BAC' 970601
'IGH' 970606};
d2 = {'IGH' 'FINANCE' 'BANK1'
'FED' 'HEALTH' 'PILLS'
'ABC' 'FINANCE' 'BANK3'};
%// get all possible keys, and convert them to indices starting at 1
[keys,~,ind] = unique( [d1(:,1);d2(:,1)] );
%// inner join
ind1 = ind(1:size(d1,1));
ind2 = ind(size(d1,1)+1:end);
loc1 = ismember(ind1, ind2);
loc2 = ismember(ind2, ind1);
innerJoin = cell(sum(loc1),3);
innerJoin(:,1) = d1(loc1,1);
innerJoin(:,2) = d1(loc1,2);
innerJoin(:,3) = d2(loc2,2);
innerJoin(:,4) = d2(loc2,3);
这给
innerJoin =
'ABC' [970508] 'FINANCE' 'BANK1'
'FED' [970524] 'HEALTH' 'PILLS'
'IGH' [970606] 'FINANCE' 'BANK3'
MATLAB的最新版本似乎有一个表类型,它有一个本机的innerjoin函数,因此您可以使用这些函数而不是单元数组。看见但是,这不在我的MATLAB版本(2012a)中。您希望如何使用
bsxfun
的矢量化解决方案
代码
%%// a1 and a2 are primary and secondary cell arrays resepectively
a1 ={
'a' 'ABC is correct' '970508'
'bb' 'FED' '970524'
'dwd' 'BAC' '970601'
'hoi' 'IGH' '970606'}
a2 = {
'what' 'gap' 'IGH' 'FINANCE BANK1'
'nope' 'seal' 'FED' 'HEALTH PILLS'
'yes' 'solo' 'ABC is correct' 'FINANCE BANK3'}
X = 1;%// Number of extra columns to append from secondary cell array
Y = 2;%%// Column number from primary cell array to choose from
Z = 3;%%// Column number from secondary cell array to choose from
a1col = char(a1(:,Y))
a2col = char(a2(:,Z))
ad1 = size(a2col,2)-size(a1col,2)
a1col = [a1col repmat(' ',size(a1,1),ad1)]
a2col = [a2col repmat(' ',size(a2,1),-ad1)]
tt1 = a1col-'0'
tt2 = a2col-'0'
tt3 = permute(tt2,[3 2 1])
p1 = bsxfun(@eq,tt1,tt3)
p2 = squeeze(all(p1,2))
[v1,v2] = max(p2,[],2)
%// out is the desired output
out = cell(size(a1,1),size(a1,2)+X)
out(:,1:size(a1,2)) = a1
out(v1,:) = horzcat(a1(v1,:),a2(v2(v1),Z+1:Z+X))
输出
a1 =
'a' 'ABC is correct' '970508'
'bb' 'FED' '970524'
'dwd' 'BAC' '970601'
'hoi' 'IGH' '970606'
a2 =
'what' 'gap' 'IGH' 'FINANCE BANK1'
'nope' 'seal' 'FED' 'HEALTH PILLS'
'yes' 'solo' 'ABC is correct' 'FINANCE BANK3'
out =
'a' 'ABC is correct' '970508' 'FINANCE BANK3'
'bb' 'FED' '970524' 'HEALTH PILLS'
'dwd' 'BAC' '970601' []
'hoi' 'IGH' '970606' 'FINANCE BANK1'
那些
相似的元素
总是三个字符吗?不,元素从6位数的数字到单词甚至句子都不同!你好我尝试了你的解决方案,但问题是它说我“内存不足”,所以我看不出它是否给了我想要的输出。我会设法找到解决办法,如果可行,我会告诉你。非常感谢。@user3557054您的输入单元格数组的尺寸是多少<代码>谁和大小
关于它们的信息?谁的AM1:Name AM1大小2615054x3字节62761296类双属性谁的MA1:Name MA1大小5585x5字节363213640类单元格Attributes@user3557054太大了!你最好的选择是使用一些for-loop方法。嘿!您的代码给了我这个错误:cell/unique中的错误(第90行)[varargout{1:nlhs}]=celluniqueR2012a(varargin{:});你知道这是什么意思吗?非常感谢您的帮助,我认为您在错误中遗漏了有用的信息-这只是功能单元/唯一单元中出错的那一行。根据您在另一个答案中的评论,我怀疑您的内存不足-您是否试图在大型阵列上运行此功能?我的建议是,您应该研究如何将d1和d2阵列拆分为更易于管理的大小,并在这些阵列上循环。非常感谢您的建议。我现在就试试看,如果行得通,我会告诉你的。感谢lotNow,我没有收到错误,但是innerJoin变量给了我一个0行6列的单元格。Name Size Bytes类属性innerJoin 0x6 0 cell