2013-11-27 2 views
1

Мне нужно объединить некоторые элементы в один элемент матрицы строк в MATLAB. Например, моя матрица - [1 2 3 4 5 6 7 8]. Я хочу преобразовать матрицу как [1234 5678]. Пожалуйста, помогите мне сделать это.Как объединить некоторые элементы в один элемент матрицы строк

+0

Может этот случай произойти и что бы вы, как выход быть? '[1: 12; 13: 24]' А как насчет других предположений, которые делали люди? –

ответ

1

Вы можете сделать это следующим образом:

a=[1 2 3 4 5 6 7 8]; 
vec1=a(1:4) %put a suitable number here 
vec1=num2str(vec1); 
vec1(ismember(vec1,' ')) = []; 
vec1=str2double(vec1); 

Аналогично, выполните описанную выше последовательность операций на второй половине вектора и просто сцепить их в окончательный вектор.

Примечание. Это решение работает только для вектора строк, как вы упомянули в вопросе (вы упомянули матрицу строк, но я предполагаю, что это то, что вы имели в виду).

1

От этого зависит. Если вы можете гарантировать, что ваша строка будет всегда кратна 4, вы можете сделать следующее:

reshape(sum(bsxfun(@times,reshape(Q',4,[])',[1000,100,10,1]),2),[],size(Q,1))'; 

Что это делает reshape матрица следующим образом:

[1 2 3 4 5 6 7 8  -> [1 2 3 4 
8 7 6 5 4 3 2 1]   5 6 7 8 
          8 7 6 5 
          4 3 2 1] 

Затем множественным каждая строка по [1000,100,10,1] и сумма каждой строки:

[1 2 3 4   [1000 200 30 4   [1234 
5 6 7 8 ->  5000 600 70 8 ->  5678 
8 7 6 5   8000 700 60 5   8765 
4 3 2 1]   4000 300 20 1]   4321] 

Наконец мы перекроить матрицу снова, чтобы вернуться к первоначальной форме.

[1234   [1234 5678 
5678 ->  8765 4321] 
8765   
4321]   
+0

здесь идет один лайнер! :) –

+1

Довольно длинный, хотя. Исправлена ​​небольшая ошибка во внешнем вызове с изменением формы и немного упрощена внутренняя. –

+0

Приветствую вас, я должен признать, что я не знал о пустом упрощении. Сегодня я узнал что-то новое. – MrAzzaman

1

сначала определить значения в числовом массиве:

a = [1 2 3 4 5 6 7 8]; 

Следующая преобразовать в строку:

b = num2str(a); 

Теперь удалить все пробелы:

b(find(b == ' ')) = ''; 

Вставить пустое пространство посередине d затем преобразовать обратно в числовой массив (я думаю, что это то, что вы хотите()?):

c = str2num([b(1:4),' ',b(5:end)]); 

Так что

>> c(1) 

ans = 

     1234 

>> c(2) 

ans = 

     5678 

Edit: Добавлен 'конец', чтобы покрыть произвольный диапазон.

+0

Обратите внимание, что это даст неожиданные результаты, если числа больше 9. –

+0

Да, ваше право, поэтому я добавил «конец», чтобы покрыть произвольный диапазон. Мне все еще не совсем понятно, как обобщить точку «расщепления», только с информацией, которую мы имеем. Благодарю. –

3

Рассмотрим следующую анонимную функцию для обобщенного числового решения для комбинирования одной цифры:

combineDigits = @(x) x*(10.^(length(x)-1:-1:0)).'; 

Каждый элемент x должен быть на [0,9] (т.е. одной цифры). Для примера ввода:

>> x = [1 2 3 4 5 6 7 8] 
x = 
    1  2  3  4  5  6  7  8 
>> x1 = x(1:4); x2 = x(5:end); 
>> combineDigits(x1) 
ans = 
     1234 
>> combineDigits(x2) 
ans = 
     5678 
>> 

анонимной функции combinedDigits может быть применен с любой общей функции полезности, такие как cellfun, для обработки блоков данных.Например, рассмотрят 2x8 матрицу M цифр, разделенных в массив 2x2 ячейки 1x4 значных массивы:

>> M = randi(9,2,8) 
M = 
    4  8  6  8  7  7  6  7 
    9  9  1  9  7  4  2  1 
>> Mpartitioned = mat2cell(M,[1 1],[4 4]) % specify ANY valid partitioning here 
Mpartitioned = 
    [1x4 double] [1x4 double] 
    [1x4 double] [1x4 double] 
>> Mcompacted = cellfun(combineDigits,Mpartitioned) 
ans = 
     4868  7767 
     9919  7421 
Смежные вопросы