フィルターのクリア

Setting up vector function

1 回表示 (過去 30 日間)
K O
K O 2017 年 11 月 9 日
編集済み: K O 2017 年 11 月 10 日
I write a function SetUp to set up three vectors from an input vector k. Vector c = (-k(2); -k(3); ..... -k(n)) where I have n-1 elements. Vector d = (k(1)+k(2); k(2)+k(3); ...... k(n-1)+k(n); k(n)) where there are n elements And vector e = vector c.
Here is the code I wrote:
function [c,e,d] = SetUp
k = input('Enter k vector');
n = size(k,2);
for k1 = 1:n
c = -k(k1)*ones(n-1,1);
d = (k(k1)+k(k1+1))*ones(n,1); d(n) = k(n);
e = c;
end
end
By running this code I get an error: Index exceeds matrix dimensions.
Problem is in this line: d = (k(k1)+k(k1+1))*ones(n,1); d(n) = k(n);
In my opinion the problem is in indexing as the last term when Matlab runs d = (k(k1)+k(k1+1))*ones(n,1); is d = k(n)+k(n+1), where the program does not recognize k(n+1) as there is no such term in vector k.
So, the question is, how to overcome this problem as I don't even need the last term as the last term is d(n) = k(n)???
Thanks in advance!
  1 件のコメント
Guillaume
Guillaume 2017 年 11 月 9 日
You have to ask yourself several questions:
  • What is the purpose of the loop in your code? Note that at each iteration, you're completely overwriting the previous value of c, d and e.
  • Is a loop required to do what you want? (Hint: No)
  • How can you have a different equation for the last term? (Hint: calculate all the other terms from 1 to n-1 instead of up to n)
  • What happens with your code if the user enters a column vector instead of a row vector? (Hint: use numel instead of size(x, 2))

サインインしてコメントする。

採用された回答

Eric
Eric 2017 年 11 月 9 日
編集済み: Eric 2017 年 11 月 9 日
In your for loop, you are using k(k1+1). if k1 is the last element of k, then k(k1+1) will be exceeding the dimension of k. If you dont care about the last term, use
for k1 = 1:n-1
... Stuff ...
end
d(n) = k(n);
or if you need the other vectors to go to n, stick it in a conditional
for k1 = 1:n
... Other Stuff ...
if k1~=n
d = (k(k1)+k(k1+1))*ones(n,1);
end
end
  1 件のコメント
K O
K O 2017 年 11 月 9 日
I see what I was missing.
if k1~=n
d = (k(k1)+k(k1+1))*ones(n,1);
end
Thanks man!

サインインしてコメントする。

その他の回答 (1 件)

KL
KL 2017 年 11 月 9 日
編集済み: KL 2017 年 11 月 9 日
c = -k(2:end); %EDITED
d = k+[k(2:end);0];
e = c;
in case, k is row vector,
c = -k(2:end); %EDITED
d = k+[k(2:end),0];
e = c
that's all you need. No need for a loop!
  3 件のコメント
K O
K O 2017 年 11 月 9 日
I'll try without the for loop too.
Ty KL and Eric for discussion.
KL
KL 2017 年 11 月 9 日
Bam! I totally overlooked it! Thanks, I'll edit the answer.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by