【问题标题】:Comparing two matrices in MATLAB with different array sizes比较 MATLAB 中具有不同数组大小的两个矩阵
【发布时间】:2013-10-23 23:00:04
【问题描述】:

这是我的示例数据:

Arr StarP:
2141865 16
2141865 17
2141865 17
2141865 16
2141865 17
2141865 20
2141865 9
2141865 7
2141865 19
2141865 18
2141865 19
2141865 9
2141865 9
2141865 9
2141865 9
Arr medians:
2141865 16

目标是将 Arr StarP 与 Arr 中位数进行比较,并找出 Arr StarP 中具有相应 ID (2141865) 的任何值是否在 Arr 中位数中该 ID 的值的某个范围内(如果大于 1.5* 或1.5* 更小),如果不是,则需要乘以或除以 1.5。如果 Arr StarP 的值比 Arr 中位数大或小 2*,那么我希望在新的平均值计算中忽略该值。

示例输出:

2141865 14.00666667

附: Arr B 的实际大小是 198x2,Arr A 是 45879x2,Arr A 中有许多不同的 ID,而 Arr B 正好有 198,Arr B 是通过找到 Arr A 中所有值的中位数与匹配 ID 得出的并输出该中位数和 ID。

【问题讨论】:

  • 我尝试过使用 accumarray 和 ismember 但由于我不太习惯 matlab 我不明白用什么方法来解决这个问题,我也尝试了带有嵌套 if 语句的循环但不匹配由于文件的格式,索引正确。
  • 请提供一个可复制粘贴的示例,其中B 也有意义。
  • 编辑显示了我到目前为止的所有内容以及中位数是如何从 StarP 派生的,ismember 是我尝试开始循环但我不知道如何处理它。
  • @ImmortalxR 请同时添加一个 ArrB 和一个手工制作的示例输出
  • @Dan 我不太明白你对 Arr B(中位数)还有什么要求,这正是它的样子。我还刚刚添加了示例输出。

标签: arrays matlab


【解决方案1】:
function [medians, newAverage] = Medians_Koi(StarData, R, M)

    %//R is this range outside of which values must be multiplied. I'm assuming it's expressed in terms of the median, so for example if R is [0.8, 1.2] and the median is 10 then the range allowed is 8 - 12.
    %//M is what to multiply by (this really should have been explained in the question)

    %//why are you doing this with global and evalin?? This is really really bad practice and there is no reason for it. Just make the function accept input arguments and output output arguments
    %//StarData = evalin('base', 'StarP');
    %//global medians;
    %//global newAvg;

    StarData2 = StarData;

    [IDs, ~, Groups_1] = unique(StarData(:,1),'stable');
    medians = [IDs, accumarray(Groups_1, StarData(:,2), [], @median)];

    for g = 1:size(Group_1,1)
        toMultiply = (StarData(:,1)==IDs(g)) & (StarData(:,2) < medians(g)*R(1));
        toDivide = (StarData(:,1)==IDs(g)) & (StarData(:,2) > medians(g)*R(2));
        StarData2(toMultiply,2) = StarData(toMultiply,2) .* M(1);
        StarData2(toDivide,2) = StarData(toDivide,2) ./ M(2);
    end

    newAverage = [IDs, accumarray(Groups_1, StarData2(:,2), [], @mean)];

end

【讨论】:

  • 我还不能尝试这个,但我做了一些修改,可能有助于更好地理解这个问题。
  • @ImmortalxR 我的代码很容易适应你的新需求。我会把它作为练习留给你。
  • 我做了一个小的编辑来修复一些拼写错误以及使用 ID 和 Groups_1 导致我的 accumarray 错误,如果我错了,请随时纠正我,但新编辑的代码非常适合我.
  • 我在上面编辑代码时实际上遇到了问题,其中 toMultiply 函数似乎将 StarData(:,2) 中的所有值相乘,而不仅仅是应该过滤的值,在换句话说,toMultiply 与 StarData(:,1) 一样大,因此它会不加选择地乘以所有内容
  • @ImmortalxR 你的编辑做了太多的改变。答案就足够了,因为它代表任何人都可以复制它
猜你喜欢
  • 2017-10-27
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多