{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Sending Large Volumes To Matlab","description":"Accelerate E&P application development and protect your innovation by consuming our Data and Domain APIs / Platform APIs.","lang":"en-US","meta":[{"name":"robots","content":"noindex"}],"llmstxt":{"hide":false}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"sending-large-volumes-to-matlab","__idx":0},"children":["Sending Large Volumes To Matlab"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For very large files the data must be buffered so that large arrays do not have to be allocated."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"        ISeismicData seismicData = (ISeismicData)IData.factory.createNewInstance(\"myData.xgy\");\n        ISeismicReader reader = seismicData.select(new SeismicRangeQuery());\n        IMatlabProxy proxy = IMatlabConnector.Factory.getInstance().getProxy();\n        IKeyRange inlineKey = seismicData.getDataRange().get(0);\n        IKeyRange xlineKey = seismicData.getDataRange().get(1);\n        ISeismicReader reader = seismicData.select(new SeismicRangeQuery()); //select all data\n        IFieldDesc inlineFieldDesc = reader.getTraceHeaderField(inlineKey.getName());\n        IFieldDesc xlineFieldDesc = reader.getTraceHeaderField(xlineKey.getName());\n        int numInlines = (int) (inlineKey.getMaximum() - inlineKey.getMinimum()) + 1;\n        int numXlines = (int) (xlineKey.getMaximum() - xlineKey.getMinimum()) + 1;\n        int numberOfSamples = reader.getDataStatistics().getSamplesPerTrace();\n        int numberOfTraces = reader.getNumberOfTraces();\n        proxy.eval(\"volume = zeros(\" + numInlines + \",\" + numXlines + \",\" + numberOfSamples + \");\"); //allocate variable in matlab\n        Map<Integer, Map<Integer, List<Double>>> volumeData = new HashMap<Integer, Map<Integer, List<Double>>>();\n        for (int i = 0; i < numberOfTraces; i++) {\n            ITrace trace = reader.getTrace(i);\n            float[] samples = new float[numberOfSamples];\n            trace.getSamples(samples);\n            int inline = trace.getHeader(inlineFieldDesc.getIdentifier()).intValue();\n            int xline = trace.getHeader(xlineFieldDesc.getIdentifier()).intValue();\n            if (!volumeData.containsKey(inline)) {\n                volumeData.put(inline, new HashMap<Integer, List<Double>>());\n            }\n            Map<Integer, List<Double>> xlines = volumeData.get(inline);\n            if (!xlines.containsKey(xline)) {\n                xlines.put(xline, new ArrayList<Double>());\n            }\n            List<Double> sampleData = xlines.get(xline);\n            for (int j = 0; j < samples.length; j++) {\n                sampleData.add(new Double(samples[j]));\n            }\n            if (((i + 1) % 10000) == 0 || ((i + 1) == numberOfTraces && !volumeData.isEmpty())) { //write out traces we have so far\n                for (Map.Entry<Integer, Map<Integer, List<Double>>> inlineEntries : volumeData.entrySet()) {\n                    for (Map.Entry<Integer, List<Double>> xlineEntries : inlineEntries.getValue().entrySet()) {\n                        List<Double> values = xlineEntries.getValue();\n                        Integer currInline = inlineEntries.getKey();\n                        Integer currXline = xlineEntries.getKey();\n                        int inlineIndex = (currInline - (int) inlineKey.getMinimum()) + 1; //+1 because indexes start at 1 in matlab\n                        int xlineIndex = (currXline - (int) xlineKey.getMinimum()) + 1;\n                        for (int j = 0; j < values.size(); j++) {\n                            proxy.eval(\"volume(\" + inlineIndex + \",\" + xlineIndex + \",\" + (j + 1) + \") = \" + values.get(j)+\";\");\n                        }\n                    }\n                }\n                volumeData.clear();\n            }\n        }\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note: This method can be further optimized by sending larger arrays that can then be copied into the volume variable."]}]},"headings":[{"value":"Sending Large Volumes To Matlab","id":"sending-large-volumes-to-matlab","depth":1}],"frontmatter":{"title":"Sending Large Volumes To Matlab","pageId":"other-useful-intviewer-apis/matlab-api/sending-large-volumes-to-matlab","seo":{"title":"Sending Large Volumes To Matlab"}},"lastModified":"2026-10-22T14:32:05.579Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/intviewer/other-useful-intviewer-apis/matlab-api/sending-large-volumes-to-matlab","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}