Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在给定特定条件的情况下将元素传递到不同的单元格数组_Arrays_Matlab_String Matching_Similarity_Cell Array - Fatal编程技术网

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