Subscripted assignment dimension mismatch. error in for loop

2 次查看(过去 30 天)
for i = 1 : (length(locs_min)*2) + 1;
output2(:,i+1) = output(locs_min(i):locs_max(i));
i = i + 1;
n = n + 1;
end
gives error:
|Subscripted assignment dimension mismatch.
Error in Ralphuh (line 74) output2(:,i+1) = output(locs_min(i):locs_max(i));|
output2 is a new variable, output is a 53957x1 double array, and locs_min and locs_max are both 1x538 double arrays.
I have tried transposing the different matrices, changing around the format of my indices, etc...nothing seems to work, please help, thanks!

回答(3 个)

dpb
dpb 2015-11-2
Unless the difference between the indices is the same for each iteration, you'll "go boom" the first time the length is different than the preceding.
Use a cell array in this case instead...Matlab's only support for "jagged" arrays.
  2 个评论
Ralph
Ralph 2015-11-2
Hi dpb,
I am trying to avoid a cell array, but thank you. Can you please clarify what you mean by the following:
"Unless the difference between the indices is the same for each iteration, you'll "go boom" the first time the length is different than the preceding."
dpb
dpb 2015-11-3
Precisely what you see as the error and go on to explain is similar to what I presumed; the lengths of the various subsections aren't the same from one step to the next. If, say the first is min-max -->[1 20] the array will have been allocated by the first assignment as 1,20. Now if the next two locations are [21 40], you're fine but as soon as one isn't precisely 20 elements, then the assignment to that row will be off in the second dimension.
for i=1:length(locs_min)
output2{i} = output(locs_min(i):locs_max(i));
end
output will now be a cell array of the number of elements in the two location arrays. The {} curlies in the indexing instead of () normal parens make it such.

请先登录,再进行评论。


Star Strider
Star Strider 2015-11-2
What do you want to do?
You might be able to get there more easily with the reshape function.
  5 个评论
Ralph
Ralph 2015-11-3
Ok...so I have a cell array of non-uniform doubles...I want to reshape them to be about 10 columns and 100 rows...then plot the average of the data as if I was plotting mean(numeric array, 10).
then plot the diff as if I was plotting diff(numeric array, 10)...how would I do that? I can't figure it out for the life of me.
Star Strider
Star Strider 2015-11-3
What you want to do will only work if the vectors are at least (or can be truncated to be exactly) 1000 elements long.
Guessing here since I don’t know how your data are organised, but something like this should work:
Vc = {1:1111}; % Original Cell Vector
V = Vc{1}(1:1000); % Original Cell Vector (Truncated)
V = V(:); % Convert To Column Vector
Vr = reshape(V(:), 100, 10); % Reshape To Desired Matrix
drVr = diff(Vr, [], 2); % Differences Along Columns
dcVr = diff(Vr, [], 1); % Differences Along Rows
I’m not quite certain what you want with respect to diff, so I present you with two options.

请先登录,再进行评论。


Ralph
Ralph 2015-11-3
currently working on inputting my data into zero matrices...thanks for your help
  1 个评论
Star Strider
Star Strider 2015-11-3
My pleasure.
Note that the zeros are valid data. It might be best to pad them with NaN instead. However, I would see if the code in my comment to my Question does what you want before your start with padded matrices.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by