我有一个基本的txt文件,内容如下:
0 0 0 40
0 0 1 40
0 1 0 40
0 1 1 40
1 15 15 250
1 15 16 250
1 16 15 250
1 16 15 250
列如下:
Class Truth Label
X
Y
Pixel Intensity
我正在尝试计算文件中每个类的平均向量。为此,我不确定我是否可以简单地执行
meanVector = mean(MyImage);
我不确定这是因为列不是所有像素密度 我怀疑我将有两个平均向量,0级和1级。
testFile = fopen('test_file.txt', 'r');
sizeOfTestFile = [4 Inf];
testFileMatrix = fscanf(testFile, '%d', sizeOfTestFile);
testFileMatrix = testFileMatrix’
在上面的代码中,我正在为'test_file.txt'生成FileID,并通过扫描原始文件创建一个8 x 4矩阵。
因此,我需要将这个新创建的Matrix拆分为两个,这样我有一个4 x 4,其中所有行的Class为0,另一个4 x 4,其中所有行的Class都是1?< / p>
然后我会选择像素密度列的方法吗?
很抱歉这个问题,我主要是试图理解问题本身,而不一定要在语法上挣扎。
答案 0 :(得分:5)
最好的办法是使用accumarray
,因为这自然会将数字放入同一组。例如,我们将像素密度的前四个值放入组0,将接下来的四个值放入组1.然后对属于每个组的值应用一些操作。在这种情况下,您想要应用均值。
唯一的复杂性是MATLAB开始索引为1,因此您需要偏移文本文件的第一列,组号为1。
因此,这段代码非常简单:
% Your code
testFile = fopen('test_file.txt', 'r');
sizeOfTestFile = [4 Inf];
testFileMatrix = fscanf(testFile, '%d', sizeOfTestFile);
testFileMatrix = testFileMatrix';
% Calculate the average of each group
means = accumarray(testFileMatrix(:, 1) + 1, testFileMatrix(:, 4), [], @mean);
我们得到:
>> means
means =
40
250
显然,每组的平均值分别为40和250,因为每组只有40和250.
如果您与accumarray
混淆,您可以做的一件事就是查看所有唯一的组值,循环显示它们并找出属于该组的像素密度并找到平均值。
这样的事情会起作用:
means = [];
for i = 1 : max(testFileMatrix(:, 1)) + 1
means(end + 1) = mean(testFileMatrix(testFileMatrix(:, 1) + 1 == i, 4));
end
这将迭代地将每个组的平均值添加到means
向量,直到您到达所有组。这当然是一个较慢的选择,但如果你对accumarray
感到不舒服,它会以更直观的方式做你想做的事。