Как заменить значение Matrix на строку из массива ячеек? - PullRequest
0 голосов
/ 01 октября 2018

У меня есть массив ячеек (c) строк с некоторыми числами, помеченными знаком «#», и у меня есть матрица (данные) с такими же размерами (5x6).Если «c» имеет номер, помеченный символом «#», тогда я хочу заменить число в том же месте «data» на строку, содержащую «#».
Например, данные (1,1) должныбыть '# 2.537'.Вывод должен быть похож на массив ячеек «dataT1_2», сгенерированный приведенным ниже сценарием.Код ниже работает, но я думаю, что это немного комично и новичок.

c = {
    '# 2.537'    '1.219'      '0.457'    '0.214'    '# 0.120'    '0.245'
    '3.244'      '# 1.400'    '0.649'    '0.515'    '0.207'      '0.075'
    '2.993'      '1.282'      '0.605'    '0.309'    '0.140'      '0.140'
    '3.278'      '1.507'      '0.885'    '0.405'    '0.160'      '0.111'
    '3.691'      '1.474'      '0.650'    '0.316'    '0.180'      '0.155'}

IndexE = strfind(c, '#')

data=[
    0.8147    0.0975    0.1576    0.1419    0.6557    0.7577
    0.9058    0.2785    0.9706    0.4218    0.0357    0.7431
    0.1270    0.5469    0.9572    0.9157    0.8491    0.3922
    0.9134    0.9575    0.4854    0.7922    0.9340    0.6555
    0.6324    0.9649    0.8003    0.9595    0.6787    0.1712]

[row,col] = find(~cellfun(@isempty,IndexE))

temp=strsplit(num2str(data(:)'))
shape=size(data)
temp2 = reshape(temp, shape(1,1), shape(1,2))
dataT1_2=temp2;

for m = 1:length(row)
    temp3(m,1)=strcat('# ',temp2(row(m,1),col(m,1)));
    dataT1_2(row(m,1),col(m,1))=temp3(m,1);
end

1 Ответ

0 голосов
/ 01 октября 2018

В основном вам необходимо научиться использовать логическое индексирование, например,

>> tmp = cellfun(@num2str,num2cell(data),'uni',false); % convert to strings
>> loc = contains(c,'#')  % get locations of elements with a #
loc =
  5×6 logical array
   1   0   0   0   1   0
   0   1   0   0   0   0
   0   0   0   0   0   0
   0   0   0   0   0   0
   0   0   0   0   0   0
>> tmp(loc) = c(loc)  % replace elements
tmp =
  5×6 cell array
    {'# 2.537'}    {'0.0975' }    {'0.1576'}    {'0.1419'}    {'# 0.120'}    {'0.7577'}
    {'0.9058' }    {'# 1.400'}    {'0.9706'}    {'0.4218'}    {'0.0357' }    {'0.7431'}
    {'0.127'  }    {'0.5469' }    {'0.9572'}    {'0.9157'}    {'0.8491' }    {'0.3922'}
    {'0.9134' }    {'0.9575' }    {'0.4854'}    {'0.7922'}    {'0.934'  }    {'0.6555'}
    {'0.6324' }    {'0.9649' }    {'0.8003'}    {'0.9595'}    {'0.6787' }    {'0.1712'}

РЕДАКТИРОВАТЬ : на основании вашего комментария третья строка изменится на:

>> tmp(loc) = cellfun(@(x)sprintf('# %s',x),tmp(loc),'uni',false)
tmp =
  5×6 cell array
    {'# 0.8147'}    {'0.0975'  }    {'0.1576'}    {'0.1419'}    {'# 0.6557'}    {'0.7577'}
    {'0.9058'  }    {'# 0.2785'}    {'0.9706'}    {'0.4218'}    {'0.0357'  }    {'0.7431'}
    {'0.127'   }    {'0.5469'  }    {'0.9572'}    {'0.9157'}    {'0.8491'  }    {'0.3922'}
    {'0.9134'  }    {'0.9575'  }    {'0.4854'}    {'0.7922'}    {'0.934'   }    {'0.6555'}
    {'0.6324'  }    {'0.9649'  }    {'0.8003'}    {'0.9595'}    {'0.6787'  }    {'0.1712'}

РЕДАКТИРОВАТЬ 2 : Если вы используете более старую версию MATLAB, у которой нет функции contains, тогда вы можете заменить соответствующую строку на

>>loc = cellfun(@(x)~isempty(strfind(x,'#')),c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...