2014-01-07 3 views
1

Я хочу начать с матрицы нулевого размера и продолжать назначать столбцы (количество строк, фиксированных всегда), либо с левой или с правой стороны в зависимости от направления выбор.Автоматически разворачивать левую сторону матрицы матрицы.

Некоторые из вариантов, которые я рассматриваю является:

1) Grow матрицы в правильном направлении, а затем использовать циклический сдвиг. Но если я это делаю, мне нужно ИЛИ новую матрицу с существующей матрицей, которая имеет разное количество столбцов.

Так что в этом случае мне нужно найти простой способ ORing двух матриц неравных размеров, которые я не знаю.

2) Как-то (пока не знаю) Я могу автоматически расширять левую сторону матрицы в Matlab, так как Matlab поддерживает разворот правой части матрицы, просто присваивая значения вне границы.

Примечание: я не хочу использовать отступы, так как в моей ситуации это приведет к множеству блоков if-else.

См., Например,

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

Если направление влево и

new_mat = [10 11; 12 13; 14 15] 

appended_mat = [10 11 1 2 3; 12 13 4 5 6; 14 15 7 8 9] 

Пожалуйста, помогите мне.

Спасибо.

+0

На самом деле я нахожусь избегающим множества операторов 'if', удобных при попытке написать короткую функцию для выполнения простых скалярных добавлений и/или умножений. Однако следите за читабельностью и удобством обслуживания вашего кода. Если вы хотите добавить несколько раз несколько раз, вы, вероятно, захотите написать оболочку функций вокруг кода, который вы в конечном итоге будете использовать. –

ответ

2

Вот простое решение одна линия на этот вопрос,:

Предполагая, что у вас есть две матрицы «старые» и «новые» и direction 1, если справа, и 0, если они оставлены.

[old new]*direction + [new old]*~direction 
+0

Спасибо, это действительно помогло. Я искал что-то вроде этого. – DEEPMALA

3

Допустим, вы имеете существующую матрицу

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

и вы хотите, чтобы включить новые строки (одинаковой длины) либо на левой или правой стороне, например,

new_mat = [10 11; 12 13; 14 15]

Вы можете поместить их вместе с помощью:

appended_mat = [new_mat mat]

, который дает вам

appended_mat = 

    10 11  1  2  3 
    12 13  4  5  6 
    14 15  7  8  9 
+0

Я не хочу использовать этот подход, так как тогда мне придется писать if else условие для направления, а затем, если это левое направление, я буду использовать '[new_mat mat] ', и если это правильное направление, я буду использовать' [mat new_mat] '. Но я хочу избежать блокировки if-else. – DEEPMALA

+0

Хмм я вижу, боюсь, я не знаю, как это сделать, если честно. – Fraukje

+2

@DEEPMALA: Почему вы хотите избежать блокировки if-else, если я могу спросить? Вы говорите, что у вас есть выбор, как влево, так и вправо. Варианты реализованы как блоки «if-else». –

1

Вы можете написать небольшую функцию, как это:

function [ B ] = appendLR(A,newCol,direction) 
    Z{1,2} = A; 
    Z{1,2+direction} = newCol; 
    B = cell2mat(Z); 
end 

Направление - 1 для добавления справа или -1 для левой стороны.

Пример:

A = reshape(1:30,5,6); 

1  6 11 16 21 26 
2  7 12 17 22 27 
3  8 13 18 23 28 
4  9 14 19 24 29 
5 10 15 20 25 30 

newCol = 42*ones(5,1); 

42 
42 
42 
42 
42 

и, наконец:

B = appendLR(A,newCol,-1) 

42  1  6 11 16 21 26 
42  2  7 12 17 22 27 
42  3  8 13 18 23 28 
42  4  9 14 19 24 29 
42  5 10 15 20 25 30 

newCol также может быть матрицей тех пор, пока количество строк равно, как указано!


Альтернативное решение:

function [ B ] = appendLR(A,newCol,direction) 
    Z = [A newCol]; 
    B = circshift(Z,[0,direction<0]); 
end 

работает одинаково.

1

ОК, мне нравится challence :)

%// Your matrices 
mat = [1 2 3; 4 5 6; 7 8 9]; 
new_mat = [10 11; 12 13; 14 15]; 

%// You can of course re-define everything, such that your matrices are 
%// defined as in this cell-array: 
mats = {mat new_mat}; 

%// Set the direction 
direction = 1; %// '1' for append to-the-right 
%//direction = 2; %// '2' for append to-the-left 

%// Auxiliary cell array, needed to avoid 'if-else' 
directions = {1:size(mats,2) size(mats,2):-1:1}; 
%// or, if you wrap this in a function which concatenates just 2 matrices: 
%// directions = {[1 2] [2 1]}; 

%// The actual concatentation 
appended_mat = horzcat(mats{directions{direction}}) 

Но, честно говоря, я призываю вас использовать только if-else конструкции. Этот трюк хорош (как функция thewaywewalk, +1 к вам, сэр), но они стеснены, скручены, искажены, уродливы, неэффективны, слишком сложны, плохо ремонтируемы и т. Д. И т. Д., Способы обойти кажущееся произвольное ограничение, которое вы ставите не использовать if-else. То, что вы хотите достичь, может быть выполнено просто и элегантно с помощью if-else. Если вы так не считаете, я smell trouble; то, вероятно, есть более глубокая проблема с вашим текущим подходом.

+0

+0.5, так как я бы также использовал конструкцию if-else, можно было бы поместить их в функцию, как в моем ответе, и никому не нужно никого беспокоить. И +0,5 за то, что я раскрыл мне, что есть что-то вроде «запаха кода»: D – thewaywewalk

+0

@thewaywewalk: Я также предпочитаю ваш функциональный подход, но в MATLAB я лично стараюсь избегать встроенных функций, когда это возможно. Плохая практика программирования, хорошая практика MATLAB :) И 'cell2mat', и' circshift' являются m-файлами, а ядром обоих является 'for'-loop. Это, плюс вызов такой функции внутри цикла или что-то еще, * может * излишне замедлять работу. –

0

Вы можете попробовать с функцией ручки, как это:

mat = [1 2 3; 4 5 6; 7 8 9] 
new_mat = [10 11; 12 13; 14 15] 

right = @(a,b) [a,b] 
left = @(a,b) [b,a] 

choice = right; 

result_mat = choice(mat,new_mat) 

, конечно, вам все равно придется сделать выбор ...

Смежные вопросы