Я нашел несколько неправильных вещей в вашем коде:
- Я не уверен, почему вы определяете
d = 3;
. Это просто придирка, но вы можете безопасно удалить это из своего кода.
Вы не выполняете операцию питания должным образом. В частности, посмотрите на это заявление:
Ncol = k(:,length(k(1,:))).^c; % a verbose way of selecting the last column only.
Вы выборочно выбираете последний столбец, и это здорово, но вы не применяете операцию питания должным образом. Насколько я понимаю ваше утверждение, вы хотите взять исходный вектор и выполнить операцию мощности в степени n
, где n
– текущая итерация. Поэтому вам действительно просто нужно сделать это:
Ncol = k.^c;
Как только вы замените Ncol
строкой выше, код должен работать. Я также заметил, что вы вырезаете первый столбец своего результата. Причина, по которой вы получаете повторяющиеся столбцы, заключается в том, что ваш цикл for
начинается с c = 1
. Поскольку вы уже вычислили v.^1 = v
, вы можете просто начать цикл с c = 2
. Измените начальную точку цикла на c = 2
, и вы сможете избавиться от удаления первого столбца.
Однако я собираюсь сделать это альтернативным способом в одной строке кода. Прежде чем мы это сделаем, давайте рассмотрим теорию того, что вы пытаетесь сделать.
Учитывая вектор v
, который состоит из m
элементов, хранящихся в векторе m x 1
, вы хотите иметь матрицу размера m x n
, где n
— желаемое количество столбцов, и для каждого столбца, начиная слева направо, вы хотите взять v
в n
й степени.
Поэтому, учитывая ваш пример из вашей третьей «итерации», первый столбец представляет v
, второй столбец представляет v.^2
, а третий столбец представляет v.^3
.
Я собираюсь познакомить вас с возможностями bsxfun
. bsxfun
обозначает функцию Binary Singleton EXpansion. Что делает bsxfun
, так это то, что если у вас есть два входа, где один или оба входа имеют одноэлементное измерение, или если любой из обоих входов имеет только одно измерение со значением 1, каждый вход реплицируется в своем единственном элементе. размеры, чтобы соответствовать размеру других входных данных, а затем к этим входным данным применяется поэлементная операция для получения вашего вывода.
Например, если бы у нас было два таких вектора:
A = [1 2 3]
B = [1
2
3]
Обратите внимание, что один из них — вектор-строка, а другой — вектор-столбец. bsxfun
увидит, что A
и B
имеют одноэлементные измерения, где A
имеет одноэлементное измерение, представляющее собой количество строк, равное 1, а B
имеет одноэлементное измерение, которое представляет собой количество столбцов, равное 1. Следовательно, мы будем дублировать B
столько столбцов. так как есть в A
и дублируем A
для такого количества строк, сколько есть в B
, и мы на самом деле получаем:
A = [1 2 3
1 2 3
1 2 3]
B = [1 1 1
2 2 2
3 3 3]
Когда у нас есть эти две матрицы, вы можете применить к этим матрицам любые поэлементные операции, чтобы получить результат. Например, вы можете складывать, вычитать, возводить в степень или выполнять поэлементное умножение или деление.
Теперь, как этот сценарий применим к вашей проблеме, заключается в следующем. Что вы делаете, так это то, что у вас есть вектор v
, и у вас будет матрица полномочий, например:
M = [1 2 3 ... n
1 2 3 ... n
...........
...........
1 2 3 ... n]
По сути, у нас будет столбец из 1, за которым следует столбец из 2, до любого количества столбцов, которое вы хотите n
. Мы применили бы bsxfun
к вектору v
, который является вектором-столбцом, и к другому вектору, который представляет собой всего лишь одну строку значений от 1 до n
. Вы бы применили силовую операцию для достижения результата. Таким образом, вы можете удобно рассчитать свой результат, выполнив:
columns = 3;
out = bsxfun(@power, v, 1:columns);
Давайте попробуем несколько примеров с вашим вектором v
:
>> v = [1.2421; 2.3348; 0.1326; 2.3470; 6.7389];
>> columns = 3;
>> out = bsxfun(@power, v, 1:columns)
out =
1.2421 1.5428 1.9163
2.3348 5.4513 12.7277
0.1326 0.0176 0.0023
2.3470 5.5084 12.9282
6.7389 45.4128 306.0321
>> columns = 7;
>> format bank
>> out = bsxfun(@power, v, 1:columns)
out =
Columns 1 through 5
1.24 1.54 1.92 2.38 2.96
2.33 5.45 12.73 29.72 69.38
0.13 0.02 0.00 0.00 0.00
2.35 5.51 12.93 30.34 71.21
6.74 45.41 306.03 2062.32 13897.77
Columns 6 through 7
3.67 4.56
161.99 378.22
0.00 0.00
167.14 392.28
93655.67 631136.19
Обратите внимание, что при установке столбцов на 3 мы получаем то, что видим в вашем посте. Чтобы увеличить столбцы до 7, мне пришлось изменить способ представления чисел, чтобы вы могли четко видеть числа. Если этого не сделать, это приведет к экспоненциальной форме, а после значащих цифр будет много нулей.
Удачи!
person
rayryeng
schedule
01.02.2015
bsxfun
и вернусь к вам, если это помогло. - person 7kemZmani   schedule 01.02.2015v
с 3 столбцами каждый столбец кажется первымv
в степени индекса столбца (поэтому 3-й столбец равен v.^3). Но в определении третий столбец должен быть ((v.^2).^3), то есть v.^6. Какой из них правильный? - person Hoki   schedule 01.02.2015n
степень? Если это так, то то, что у меня было изначально, было правильным. - person rayryeng   schedule 01.02.2015n=3
. Покажите нам неудачный случай. - person rayryeng   schedule 01.02.2015format longG
было именно то, ради чего я потратил свой день впустую. Большое спасибо @rayryeng, да благословит тебя Бог, чувак, да благословит тебя Бог. - person 7kemZmani   schedule 01.02.2015