[ 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 互联通信,计算可见性矩阵,距离矩阵 的相关文章

  • 在 Excel 中打印 MATLAB 图窗并调整其大小

    我在 MATLAB 中有两个带有手柄的图形hFig1 and hFig2 我想将它们打印到 Excel 中的特定单元格 单元格 E3 和 I3 并将它们重新调整为 2 英寸 x 3 英寸 我尝试过使用 AddPictures对象处理程序和使
  • Matlab PARFOR 循环可以通过编程方式打开/关闭吗?

    有一个关于 MATLAB 中 parfor 的简单问题 我想在程序中设置一个标志 以便在 parfor 和常规 for 循环之间进行更改 基本上 我需要此功能 以便我的代码的某些部分可以在 调试 模式下更新图形 然后当关闭该标志时 使用 p
  • 按元素出现的频率对数组元素进行排序

    是否可以在 matlab octave 中使用sort函数根据元素的相对频率对数组进行排序 例如数组 m 4 4 4 10 10 10 4 4 5 应该产生这个数组 5 10 10 10 4 4 4 4 4 5是出现频率较低的元素 位于顶部
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • MATLAB 中的多个捕获组

    我有一个包含数字或字母的字符串a 可能紧随其后的是r or l 在 MATLAB 中 以下正则表达式返回为 gt gt regexp 10r 0 9 a l r match ans 10r 我希望10 and r分开 因为我有两个捕获组 有
  • 不等间隔时间序列的移动平均线

    我有一个证券交易所股票价格的数据集 时间 价格 但数据点之间的间隔并不相等 从 1 到 2 分钟不等 在这种情况下计算移动平均值的最佳实践是什么 如何在Matlab中实现呢 我倾向于认为 点的权重应该取决于自上一个点以来的最后时间间隔 Ma
  • 在 MATLAB 中重命名文件

    我正在尝试以编程方式重命名工作目录中的文件a temp txt to b hello txt 您建议如何这样做 MATLAB中有一个简单的文件重命名函数吗 我认为您正在寻找 MOVEFILE
  • 如何在 Matlab 中将数组打印到 .txt 文件?

    我才刚刚开始学习Matlab 所以这个问题可能非常基本 我有一个变量 a 2 3 3 422 6 121 9 4 55 我希望将值输出到 txt 文件 如下所示 2 3 3 422 6 121 9 4 55 我怎样才能做到这一点 fid f
  • Matlab 和 Python 中的优化算法(dog-leg trust-region)

    我正在尝试使用 Matlab 和 Python 中的狗腿信赖域算法求解一组非线性方程 在Matlab中有fsolve https www mathworks com help optim ug fsolve html其中此算法是默认算法 而
  • Matlab:如何更改矩阵的存储方式?从 1x1x3 到 1x3?

    我目前有 val 1 0 7216 val 2 0 7216 val 3 0 7216 但我想要 0 7216 0 716 0 721 我可以做什么样的操作来做到这一点 The reshape函数将在这里解决问题 Arrange the e
  • matlab中类库的全局变量

    我有一些matlab声明的类 我如何声明所有类中都可见的常量 例如 这些常量可以是在所有类的方法中使用的物理常量 首先想到的是使用全局变量 还有更好的办法吗 最好在单独的文件中声明这些常量 包含常量的类是执行此操作的一种很好的干净方法 请参
  • 理解高斯混合模型的概念

    我试图通过阅读在线资源来理解 GMM 我已经使用 K 均值实现了聚类 并且正在了解 GMM 与 K 均值的比较 以下是我的理解 如有错误请指出 GMM 类似于 KNN 在这两种情况下都实现了聚类 但在 GMM 中 每个簇都有自己独立的均值和
  • 如何在 matlab 中创建由多个 3d 图像数据数组组成的数组

    我正在阅读 15 张图片imagedata imread imagename jpg 它的大小总是320 by 320 by 3 如何将数据放入数组中 使用 for for 循环 以便在访问新数组的第一个元素时获得输入的第一个图像的 RGB
  • 如何更改Plotyy第二轴的颜色和字体大小?

    我使用 MATLAB 的plotyy 函数绘制了两条曲线 AX H1 H2 plotyy voltage span amplitude voltage span Ca SR The problem is that I cannot chan
  • 如何在 MATLAB 中绘制 3D 曲面图?

    我有一个像这样的数据集 0 1 0 2 0 3 0 4 1 10 11 12 13 2 11 12 13 14 3 12 13 14 15 4 13 14 15 16 我想在 matlab 中绘制 3D 曲面图 使列标题位于 y 轴 行标题
  • 了解 fminunc 参数和匿名函数、函数处理程序

    请多多包涵 问题在最后 我试图找出 fminunc 调用方式的差异 这个问题源于 Andrew Ng 在他的 Coursera 机器学习课程中的第 3 周材料 我正在回答这个问题 Matlab Andrew Ng 机器学习课程中 t cos
  • MATLAB 类的 Description 和DetailedDescription 属性

    内置 MATLAB 类具有 Description 和 DetailedDescription 属性的值 gt gt handle ans meta class handle Package meta Properties Name han
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • MATLAB:在不使用循环的情况下提取矩阵的多个部分

    我有一个巨大的 2D 矩阵 我想从中提取 15 个不同的 100x100 部分 我有两个向量 x 和 y 其中保存了零件的左上角索引 我用过这样的东西 result cam1 x 1 end x 1 end 99 y 1 end y 1 e
  • matlab中求和函数句柄

    Hi我试图对两个函数句柄求和 但它不起作用 例如 y1 x x x y2 x x x 3 x y3 y1 y2 我收到的错误是 对于 function handle 类型的输入参数 未定义函数或方法 plus 这只是一个小例子 实际上我实际

随机推荐