フィルターのクリア

Zeroing matrix elements outside of a certain range.

14 ビュー (過去 30 日間)
The Gogo
The Gogo 2024 年 2 月 15 日
コメント済み: The Gogo 2024 年 4 月 15 日
edit: I changed my data example input because it was a bad example that accepted some solution that are not going to work in general
Hi guys, I would like to zero the outer elements of a matrix so that they are not counted in a sum / average.
Basically the matrix is experimental data and each column comes from a different experiment and the first and last datapoints in each experiment are likely to be artefact.
for example:
data = rand(5,2)
data = 5×2
0.3193 0.3313 0.1014 0.5895 0.2794 0.4797 0.6875 0.1108 0.6199 0.3224
and I would like to keep the points 1:4 in the first column (experiment 1) and 2:5 in the second column (experiment 2).
Ideally, I would like to input a matrix of bounds of valid range:
range = [1,4;2,5]
range = 2×2
1 4 2 5
and I would like the data for the index not in that range to be zeroed and ideally without a loop
like
data(index<range(1,:) or index>range(2,:)) = 0
but of course this is not the right line...
A long way would be:
remove = ones(5,2)
remove = 5×2
1 1 1 1 1 1 1 1 1 1
remove(range(1,1):range(1,2),1) = 0
remove = 5×2
0 1 0 1 0 1 0 1 1 1
remove(range(2,1):range(2,2),2) = 0
remove = 5×2
0 1 0 0 0 0 0 0 1 0
data(remove)=0
Array indices must be positive integers or logical values.

data appears to be both a function and a variable. If this is unintentional, use 'clear data' to remove the variable 'data' from the workspace.
ah no, even that doesn't work. But even if it would, that's way too inefficient. Sorry, really struggling...

回答 (2 件)

Dyuman Joshi
Dyuman Joshi 2024 年 2 月 15 日
A simple approach via indexing -
data = [1;2;3;4;5].*ones(5,2).*[0.5,0.4]
data = 5×2
0.5000 0.4000 1.0000 0.8000 1.5000 1.2000 2.0000 1.6000 2.5000 2.0000
out = [data(1:4,1) data(2:5,2)]
out = 4×2
0.5000 0.8000 1.0000 1.2000 1.5000 1.6000 2.0000 2.0000
  4 件のコメント
Dyuman Joshi
Dyuman Joshi 2024 年 2 月 29 日
編集済み: Dyuman Joshi 2024 年 3 月 5 日
@The Gogo, will there always be a single particular value missing from the range values?
The Gogo
The Gogo 2024 年 3 月 5 日
No, it could be any number from 0 to several tens. Both at the begining and at the end of the range.

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


Catalytic
Catalytic 2024 年 2 月 18 日
Zeroing the data will not exclude it from the average. You should use NaNs,
data = [1;2;3;4;5].*ones(5,2).*[0.5,0.4]
data = 5×2
0.5000 0.4000 1.0000 0.8000 1.5000 1.2000 2.0000 1.6000 2.5000 2.0000
range = [1,0;
inf,1.7]
range = 2×2
1.0000 0 Inf 1.7000
data(range(1,:)>data | data>range(2,:))=nan
data = 5×2
NaN 0.4000 1.0000 0.8000 1.5000 1.2000 2.0000 1.6000 2.5000 NaN
Average=mean(data,1,'omitnan')
Average = 1×2
1.7500 1.0000
  4 件のコメント
The Gogo
The Gogo 2024 年 3 月 5 日
編集済み: The Gogo 2024 年 3 月 5 日
Yes I think so. But I do not know how to treat those values as indices.
again, in a loop it would be easy by looping on indices and decide by comparing with range which values has to be zeroed.
Like for each column i,
data(j<range(i,1) | j> range(i,2),i) = 0 .
But to define j I need a for loop (plus another one for i).
I believe there is a way to make this without a loop, for all indexes at once with a matrix operation, but I do not find how.
The Gogo
The Gogo 2024 年 4 月 15 日
Yes exactly, and how can I treat values as indices? that's my problem. Again in a loop it works fine, but I don't find how to do it trhough a matrix operarion

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

カテゴリ

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

タグ

製品


リリース

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by