# merging two cell type matrix

3 views (last 30 days)
sermet on 21 Apr 2016
Commented: Andrei Bobrov on 21 Apr 2016
start_id=[{'p1'};{'p2'};{'p1'};{'p1'};{'p3'}]; %cell
finish_id=[{'p2'};{'p3'};{'p3'};{'p4'};{'p4'}]; %cell
points_id=[{'p1'};{'p2'};{'p3'};{'p4'}]; %cell
m=numel(points_id);
for i=1:m
IndexC_minus(:,i) = strfind(start_id, points_id{i});
IndexC_positive(:,i) = strfind(finish_id, points_id{i});
end
I need to create IndexC_minus_double and IndexC_positive_double matrix as follows;
IndexC_minus_double=[-1 0 0 0;0 -1 0 0;-1 0 0 0;-1 0 0 0;0 0 -1 0]; %for each [1] cell, write -1 numeric and for each [] cell write 0 numeric.
IndexC_positive_double=[0 1 0 0;0 0 1 0;0 0 1 0;0 0 0 1;0 0 0 1]; %for each [1] cell, write 1 numeric and for each [] cell write 0 numeric.
Finally, I need to merge these 2 matrix as below;
merged_matrix=[-1 1 0 0;0 -1 1 0;-1 0 1 0;-1 0 0 1;0 0 -1 1]; % overlapped 0 produces 0 in the merged_matrix. The location of 1 and -1 in the IndexC_minus_double and IndexC_positive_double matrix are the same in the merged_matrix.
Guillaume on 21 Apr 2016
Did you really mean to use strfind (which will find p1 in abcp1d) and not just compare the strings for equality with strcmp?
You have an odd way of constructing cell arrays. This is simpler:
start_id = {'p1'; 'p2'; 'p1'; 'p1'; 'p3'};

Andrei Bobrov on 21 Apr 2016
Edited: Andrei Bobrov on 21 Apr 2016
merged_matrix = bsxfun(@strcmp,finish_id,points_id')...
- bsxfun(@strcmp,start_id,points_id');
[~,~,c] = unique([start_id;finish_id;points_id]);
ii = zeros(numel(c),1);
n = cellfun(@numel,{start_id;finish_id;points_id});
ii(cumsum(n) - n + 1) = 1;
ii = cumsum(ii);
c3 = c(ii == 3)';
merged_matrix = bsxfun(@eq,c(ii==2),c3) - bsxfun(@eq,c(ii==1),c3)
v = {start_id;finish_id;points_id};
for ii = 1:3
a = regexp(v{ii},'\d','match');
v{ii} = str2double(cat(1,a{:}));
end
merged_matrix = bsxfun(@eq,v{2},v{3}') - bsxfun(@eq,v{1},v{3}');
other variant
n = numel(points_id);
s = repmat(start_id,1,n);
f = repmat(finish_id,1,n);
nn = repmat(points_id',numel(finish_id),1);
merged_matrix = strcmp(f,nn) - strcmp(s,nn);
sermet on 21 Apr 2016
Edited: sermet on 21 Apr 2016
Andrei, it gives,
Error using -
Matrix dimensions must agree
merged_matrix = bsxfun(@eq,c(ii==2),c3) - bsxfun(@eq,c(ii==1),c3)
from codes,
bsxfun(@eq,c(ii==2),c3)= []
bsxfun(@eq,c(ii==1),c3)=Empty matrix: 3-by-0
sermet on 21 Apr 2016
thank you very much, Andrei.

Guillaume on 21 Apr 2016
This is probably much simpler than Andrei's answer. I assume you meant to use strcmp in your original example:
IndexC_minus_double = cell2mat(cellfun(@(s) -strcmp(s, points_id)', start_id, 'UniformOutput', 0))
IndexC_positive = cell2mat(cellfun(@(s) +strcmp(s, points_id)', finish_id, 'UniformOutput', 0))
merged_matrix = IndexC_minus_double + IndexC_positive
Note that I assume that -1 and +1 don't overlap for the merge matrix since you haven't said what happens if this is the case
Andrei Bobrov on 21 Apr 2016
+1