【问题标题】:Logical indexing in JAVAJAVA中的逻辑索引
【发布时间】:2018-01-19 22:14:27
【问题描述】:

如何在 Java 中使用逻辑索引访问数组元素?

Matlab/Octave 相当于我想做的:

A = [1 2 3 4 5 6]
logicalarray=[0 1 0 0 0 1];
result= A(logical)

result =[2 6]

如果我在 Java 中有相同的 Alogicalarray。我如何在不使用循环的情况下获得 result

【问题讨论】:

  • 你不这样做,你必须循环 - 手动或使用流和过滤器隐式循环。
  • @luk2302 在性能方面应该首选哪一个,还是它们都一样?我们通常更喜欢在 Octave 中避免循环以获得更好的性能。你能用不同的方法发布一个答案吗?我是 Java 新手
  • Java 的语法完全不同,matlab 做不到。除非你想从java中调用matlab代码github.com/diffplug/matconsolectl
  • 逻辑数组是否只包含 0 和 1 并以此指示 falsetrue?然后我会尝试使用一些Map<Integer,Boolean>,其中数字(来自A)作为键和一个布尔值来指示该数字是否要打包到结果数组或集合中。
  • 我建议你忘掉你所知道的关于 Matlab 的一切,从头开始学习 java。它没有内置对逻辑掩码等矩阵运算的支持。完成此操作后,您可以查看像 nd4j.orgdst.lbl.gov/ACSSoftware/colt/index.html 这样的科学计算库,它们试图提供类似的功能。 P.S. 你只能接受一个答案,所以选择你最喜欢的一个并接受它。您可以随心所欲地投票,但在您的声望超过 15 人之前,您的点赞数将不会被计算在内。

标签: java matlab matrix indexing


【解决方案1】:

正如 @Oleg 所说,您在 Java 中有完全不同的语法,正如 @luk2302 提到的,您可能会使用 Streams

跟随sn-p

int[] a = {1, 2, 3, 4, 5, 6};

// logicalarray=[0 1 0 0 0 1];
// index is zero-based in Java
int[] result = IntStream.of(1, 5)
        .map(i -> a[i])
        .toArray();

System.out.println("result = " + Arrays.toString(result));

会打印

result = [2, 6]

编辑如果您需要保留logicalarray,可能的解决方案是

int[] a = {1, 2, 3, 4, 5, 6};
int[] logicalarray = {0, 1, 0, 0, 0, 1};
int[] result = IntStream.range(0, logicalarray.length) // create a stream of array indexes
        .filter(i -> logicalarray[i] == 1) // filter the indexes which are 1 in logicalarray
        .map(i -> a[i]) // map the related value from array a
        .toArray(); // create an array of the values
System.out.println("result = " + Arrays.toString(result));

【讨论】:

  • 非常感谢
  • 对不起,他们不让我勾选两个答案
  • @Ekaba 他们不让我投票。他们将我的投票记录为反馈。我试过了
  • 你是如何引用我和 luk 的?您只是复制链接并使用 [@username](copiedLink) 添加它还是有更简单的方法?
  • @Oleg 我复制了链接。我不知道答案中的其他方式。即使在 cmets 中,您也只有一个名称的自动魔法。
【解决方案2】:

你可以试试这样的:

import java.util.Arrays;
import java.util.stream.IntStream;

public class Example {
    public static void main(String[] args) {
        int[] A = {1, 2, 3, 4, 5, 6};
        int[] L = {0, 1, 0, 0, 0, 1};
        int[] n = IntStream.range(0, A.length).map(i -> A[i] * L[i]).filter(i->i>0).toArray();
        System.out.println(Arrays.toString(n));
    }
}

【讨论】:

  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多