[ STK ](十二)【代码优化】与 Matlab 互联通信,计算可见性矩阵,距离矩阵

2023-05-16

上文
[ STK ](十)【算法优化】与 Matlab 互联通信,获取卫星间可见性数据,计算可见性矩阵,距离矩阵

前言

  • 测试中发现有之前没考虑到的情况,做了修改
  • 结果矩阵的上三角与下三角的结果一样,就只获取一次数据吧
  • 懒得写注释了,将就看吧

实现代码

  • 代码目录
    在这里插入图片描述
  • main
% 注释与取消注释快捷键 Ctrl + R/T

% 获取连接id,场景内所有对象的全路径
[conid,objNames] = initConn();

% 删除场景名称
objNames(1) = '';

% 设置开始时间
startTime = 0;

% 设置结束时间
endTime = 2000;

% 设置参与计算的对象总数
count = 71;

% 获取可见性数据
result = getVisibility(objNames,startTime,endTime,count);

% 加载数据集
% load('result.mat')

% 解析可见性数据,保存为.csv 文件
analysisVisibility(result,startTime,endTime,count);

step = 99;
% 步长 100
for i = startTime:100:endTime
	if((i + step) > endTime)
		break
	end
	% 获取距离数据
	result = getRange(objNames,i,i + step,count); 

	% 解析距离数据
	analysisRange(result,i,i + step,count);
end


% 关闭连接
close(conid);
  • ininConn
% 初始化连接
function [conid,objNames] = initConn()
	stkInit;
	remMachine = stkDefaultHost;
	conid = stkOpen(remMachine);
	objNames = stkObjNames;
end
  • getVisibility
% 获取可见性数据
function [result] = getVisibility(objNames,startTime,endTime,count)
    % 设置报表样式
    style = 'Access';
    % 设置间隔时间(持续时间)
    dt = 1;
    % 保存结果集
    result = {};
    for i = 1:count
        % 打印执行进度
        disp(strcat(num2str(i)))
        for j = i:count
            if i ~= j
                [secData, ~] =stkAccReport(char(objNames(int32(i))),char(objNames(int32(j))), style,startTime,endTime,dt);
                result{i,j} = secData;
                result{j,i} = secData;
            else
                % 设置自己与自己的可见性 1
                result{i,j} = 1;
            end
        end
    end
end
  • getRange
% 获取距离
function [result] = getRange(objNames,startTime,endTime,count)
    style = 'AER';
    result = {};
    dt = 1;
    for i = 1:count
        disp(['i = ',strcat(num2str(i))])
        for j = i:count
            disp(['j = ',strcat(num2str(j))])
            if i ~= j
                try
                    rangeData = stkAccReport(char(objNames(int32(i))),char(objNames(int32(j))),style,startTime,endTime,1);
                    result{i,j} = rangeData;
                    result{j,i} = rangeData;
                catch exception
                    warning('stkAccReport err:');
                end
            else
                % 自己与自己的距离为 0
                result{i,j} = 0;
            end
        end
    end
end
  • analysisVisibility
% 解析可见性数据
function [] = analysisVisibility(result,startTime,endTime,count)
    for k = startTime:endTime
        disp(strcat(num2str(k)))
        visibility = zeros(count);
        for i = 1:count
            for j = 1:count
                if iscell(result{i,j})
                    % 其他卫星
                    [~,tmp2] = size(result{i,j}{1,1});
                    if tmp2 == 4
                        % 存在可见性
                        [access,startTime,stopTime,~] = result{i,j}{1,1}.data;
                        [accessLength1,~] = size(access);
                        % 检查是否在可见时间段内
                        for z = 1:accessLength1
                            if k >= startTime(z) && k <=stopTime(z)
                                % 存在可见性
                                visibility(i,j) = 1;
                                break;
                            end
                        end
                    else
                        % 不存在可见性
                        visibility(i,j) = 0;
                    end
                else
                    % 对自身可见,存在可见性
                    visibility(i,j) = 1;
                end
            end
        end
        csvwrite(strcat('./data/vis/visibility',num2str(k),'.csv'),visibility)
    end
end

  • analysisRange
% 解析数据
function [] = analysisRange(result,startTime,endTime,count)
    flag = 1;
    for k = startTime:endTime
        disp(strcat('k = ',num2str(k)))
        range = zeros(count);
        for i = 1:count
            disp(strcat('i = ',num2str(i)))
            for j = 1:count
                disp(strcat('j = ',num2str(j)))
                if iscell(result{i,j})
                    % 其他卫星
                    [~,tmp2] = size(result{i,j}{1,1});
                    if tmp2 == 4
                        % 存在距离
                        [time,azimuth,elevation,rangeTmp] = result{i,j}{1,1}.data;
                        % 如果取不到对应秒数的距离,说明该时刻不存在距离
                        % time ,rangeTmp 可能为空
                        try
                            if k == floor(time(flag))
                                range(i,j) = rangeTmp(flag);
                                flag = flag + 1;
                            else
                                range(i,j) = -1;
                            end
                        catch exception
                            range(i,j) = -1;
                        end
                    else
                        % 不存在距离
                        range(i,j) = -1;
                    end
                else
                    % 对自身距离为 0
                    range(i,j) = 0;
                end
            end
        end
        csvwrite(strcat('./data/range/range',num2str(k),'.csv'),range)
    end
end
  • close
% 关闭连接
function []= close(conid)
    stkClose(conid);
    stkClose;
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[ STK ](十二)【代码优化】与 Matlab 互联通信,计算可见性矩阵,距离矩阵 的相关文章

  • 将 3d 矩阵重塑为 2d 矩阵

    我有一个 3d 矩阵 n by m by t 在 MATLAB 中表示n by m一段时间内网格中的测量值 我想要一个二维矩阵 其中空间信息消失了 只有n m随着时间的推移测量t剩下 即 n m by t 我怎样才能做到这一点 你需要命令r
  • 如何获取活动对象 MATLAB GUI 的句柄

    我正在尝试使用 MATLAB GUI 创建日历 我有两个Edit Text对象 edittext1 and edittext2 我想做这个 我把光标放在edittext1然后在日历中选择日期 它会进入文本字段edittext1 同样对于ed
  • 在 C/C++ 中调用 MATLAB API

    我刚刚从某处听说 对于数值计算 MATLAB 确实提供了一些用户友好的 API 如果你在 C C 代码中调用这些 API 你可以显着加快计算速度 但我在MATLAB文档中没有找到这样的信息 例如http www mathworks com
  • 将组合字符串和数字输入的元胞数组写入文本文件

    考虑以下 DateTime 2007 01 01 00 00 2007 02 01 00 00 2007 03 01 00 00 Headers Datetime Data Dat 100 200 300 Data DateTime num
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • 整数的十进制表示形式中的分隔数字

    例如 我想将用户输入作为整数输入 45697 并将前两位数字存储在数组 向量或其他内容中 例如 4 5 6 9 7 这样我就可以使用一些函数调用来检查前两个值 4 5 并对它们进行计算 问题 我不知道如何存储恢复前两个值 有没有简单的函数调
  • 通过傅里叶空间填充进行插值

    我最近尝试在 matlab 上实现一个在傅立叶域中使用零填充的插值方法的简单示例 但我无法正常工作 我总是有一个小的频移 在傅里叶空间中几乎不可见 但它在时空上产生了巨大的误差 由于傅里叶空间中的零填充似乎是一种常见 且快速 的插值方法 因
  • python 正弦和余弦精度

    如何提高Python正弦和余弦精度 例如 我想使用以下代码 只需计算随机复向量 x 的 y cos acos x import numpy as np N 100000 x np zeros N 1j np zeros N for k in
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 如何加载具有可变文件名的 .mat 文件?

    select all mat files oar dir oar mat n oar name loop through files for l 1 length oar load pat oar l lt this is the mat
  • 从 imread 返回的 ndims

    我正在从文件夹中选取图像 尺寸为128 128 为此 我使用以下代码行 FileName PathName uigetfile jpg Select the Cover Image file fullfile PathName FileNa
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 如何正确从表中删除 NaN 值

    在 Matlab 中阅读 Excel 电子表格后 不幸的是 我的结果表中包含了 NaN 例如这个 Excel 表格 将产生此表 其中出现额外的 NaN 列 我尝试使用以下代码片段删除 NaN measurementCells readtab
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • 获取向量幂的有效方法

    我编写了一个代码 在数值上使用勒让德多项式直至某个高 n 阶 例如 case 8 p 6435 x 8 12012 x 6 6930 x 4 1260 x 2 35 128 return case 9 如果向量x太长这会变得很慢 我发现说之
  • Ilnumerics Ilpanel 在 winform 中编译成 dll 并加载到 matlab 时不激活

    我想将 Visual studio 2012 中用 C 编写的 winform 编译为 dll 然后将其加载到 matlab 2013a 中 然后 我想使用 matlab net 接口与 winform 进行交互 侦听其事件并通过一组预定义

随机推荐