2017-02-08 2 views
0

вала представляет значение и col_ind является индексом значения столбца в матрице , мы хотим, чтобы эти 2 массивов в качестве результатов:MATLAB несколько ячеек - манипуляция (замена и преобразовать в массив)

val=  [9 -2 9 -2 -2 9 -2] 
    col_ind= [1 2 2 1 3 3 2] 

из 2 ячейки {знач} и {} col_ind

{val} = [9;-2] [-2;9;-2] [-2;9] 
    {col_ind}= [1,2] [0,0,1,2,3] [0,0,0,0,0,2,3] 

Как избавиться от нулей в парном разряде в {col_ind}, чтобы получить это

{col_ind} = [1,2] [1,2,3] [2,3]

Как можно поменять местами записи в каждый двойной, а также убедитесь , что индексы столбцов меняются местами соответственно, такие что я получу это:

{val} = [9;-2] [9;-2;-2] [9;-2] 
    {col_ind}= [1,2] [2,1,3] [3,2] 

Как можно использовать сортировку функций в этом случае?

Как объединить клетки вместе, чтобы, наконец, это, массив:

col_ind = [1 2 2 1 3 3 2] 
+0

Являются массивами ячеек 'val' и' col_ind'? Что вы подразумеваете под «заменой записей в каждом двойном, а также для того, чтобы индексы столбцов были заменены»? Вы хотите сортировать отдельные массивы в val в порядке убывания и иметь col_ind в том же порядке? –

ответ

0

Надеюсь, я вас правильно понял:

col_ind= {[1,2], [0,0,1,2,3], [0,0,0,0,0,2,3]}; %define col_ind - note row vector 
val = {[9;-2]; [-2;9;-2]; [-2;9]}; %define val - note column vectors 

for cellNum=1:length(col_ind) %loop for each cell inputted 
    [val_sorted{cellNum},sortMap]=sort(val{cellNum},'descend'); %Sort val in descending order - not exactly clear from your Q! 
    colInd_noZeros=col_ind{cellNum}(col_ind{cellNum}~=0); %Remove zeros from this col_ind cell (your 1st Q?) 
    colInd_sorted{cellNum}=colInd_noZeros(sortMap); %re-order col_ind to match sorted val (your 2nd Q?) 
end 
%Now combine cells into an array, direction depends, use "vertcat" for column arrays, and "[]" for the row arrays (your 3rd Q?) 
valArray=vertcat(val_sorted{:})' 
col_indArray=[colInd_sorted{:}] 
0

Вот возможный способ сделать это с помощью sortrows и cellfun без for loop.

col_ind = {[1,2],[0,0,1,2,3],[0,0,0,0,0,2,3]} 
val = {[9;-2], [-2;9;-2], [-2;9]} 

col_ind = cellfun(@(x)x(x~=0),col_ind,'uni',0) % Get rid of zeros from the indices 
% Sort in descending order and split results in cells 
valAndIdx = cellfun(@(x,y)mat2cell(sortrows([x y(:)],-1),numel(x),[1 1]),val,col_ind,'uni',0) 

tmp = (valAndIdx{:}) 
valArray = tmp(:,1) 
col_indArray = tmp(:,2) 
Смежные вопросы