2015-02-07 3 views
0

У меня есть матрица: x=[0 0 0;5 8 0; 7 6 0]генерировать определенную матрицу в MATLAB

Я хочу матрицы: m=[0 0 0;5 8 0;7 6 0; 0 0 8;5 8 8;7 6 8; 0 0 16;5 8 16;7 6 16]

Я хочу, чтобы третий столбец матрицы x умножится каждый раз на 8, а другие две колонки остаются такими же , Я хочу, чтобы это продолжалось до тех пор, пока значение в третьей колонке не достигнет 72.

Как это сделать с bsxfun или любым другим способом?

+1

Умножено на 8 или добавлено с помощью 8? И какой элемент в столбце-3 должен достигнуть 72, любой один элемент? Должно ли оно достигать ровно 72, или, может быть, оно достигает * как минимум * 72? Я думаю, что лучший образец 'x' будет иметь разные элементы в столбце-3, а не все нули, как у вас. – Divakar

+0

Третья колонка должна быть добавлена ​​по 8 каждый раз, когда матрица повторяется ... до 72. То есть, для первого повторения в четвертой строке третий столбец будет 8 8 8. Для седьмого ряда, то есть второго повторения, третья колонка будет 16 16 16 и т. Д. До тех пор, пока эта колонна не достигнет 72. –

+0

Не могли бы также ответить на мой второй вопрос. что, если бы я хотел добавить константу в столбец 1 и столбец2 с каждым повторением матрицы. То есть, если моя константа, которую нужно добавить, равна 5, то моя первая колонка во втором повторении матрицы равна 5 10 12, а вторая - 5 13 11. В третьем повторении первая колонка становится 10 15 17, а вторая колонка становится равной 10 18 16 и так далее. В течение всего этого процесса моя третья колонка продолжается с добавлением 8 каждый раз (как вы ответили) –

ответ

0

Предполагая, что следующие два предположения, вы можете повторите попытку, указанную ниже -

  1. Продолжить adding, а не multiplying.
  2. Все final элементов в column-3, чтобы достичь как минимум 72.

Подход № 1 [С bsxfun]

stopn = 72; %// stop adding till this number 
add_factor = 8; %// Add factor to be added at each iteration to get to 72 
ntimes = ceil(max((stopn - x(:,3))/add_factor)) %// no. of iterations needed 

%// Get the starting 2d version of matrix to be added to x iteratively 
x_add_2d = zeros(size(x)); %// 
x_add_2d(:,3) = add_factor; 

%// Get the complete version of matrix to be added (in 3d), then add to x 
x_add_3d = bsxfun(@plus,x,bsxfun(@times,x_add_2d,permute([0:ntimes],[1 3 2]))) 

%// Concatenate along rows to form a 2D array as the final output 
out = reshape(permute(x_add_3d,[1 3 2]),size(x_add_3d,1)*(ntimes+1),[]) 

Подход № 2 [С repmat]

stopn = 72; %// stop adding till this number 
add_factor = 8; %// Add factor to be added at each iteration to get to 72 
ntimes = ceil(max((stopn - x(:,3))/add_factor)); %// no. of iterations needed 

out = repmat(x,[ntimes+1 1]) %// replicated version of x 
add_col3 = repmat([0:8:ntimes*8],size(x,1),1) %// column-3 values to be added 
out(:,3) = out(:,3) + add_col3(:) %// add those for the final output 

Пример запуска -

x = 
    52 43 57 
    41 40 48 
    41 49 50 
out = 
    52 43 57 
    41 40 48 
    41 49 50 
    52 43 65 
    41 40 56 
    41 49 58 
    52 43 73 
    41 40 64 
    41 49 66 
    52 43 81 
    41 40 72 
    41 49 74 
+0

Получил это ... Спасибо человеку –

+0

@SaurabhTariyal Если это ответило на ваш первоначальный вопрос, подумайте о его принятии, нажав на полую галочку рядом с ним. Благодаря! – Divakar

0

Из того, что я понимаю, что вы можете сделать это с помощью repmat и kron:

clear 
clc 

x=[0 0 0;5 8 0; 7 6 0]; 

%// Generate last column containing the values form 0 to 72, each repeated 3 times. 
y = kron(0:8:72,ones(1,3)) 

%// The first 2 columns remain the same, so we just repeat them 10 times. 

out = [repmat(x(:,1:2),10,1) y(:)] 

Использование квадратных скобок для конкатенации, выход заключается в следующем:

out = 

0  0  0 
5  8  0 
7  6  0 
0  0  8 
5  8  8 
7  6  8 
0  0 16 
5  8 16 
7  6 16 
0  0 24 
5  8 24 
7  6 24 
0  0 32 
5  8 32 
7  6 32 
0  0 40 
5  8 40 
7  6 40 
0  0 48 
5  8 48 
7  6 48 
0  0 56 
5  8 56 
7  6 56 
0  0 64 
5  8 64 
7  6 64 
0  0 72 
5  8 72 
7  6 72 
+0

спасибо Benoit_11 –

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